На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Падение Windows 10 при работе с Сом 422 портом фирмы МОХА , При закрытии приложения падает Windows 10 - появляется синий экран смерти.
    Есть следующий код. В функции ОК падает Windows 10, появляется синий экран смерти с сообщением кода остановки системы.
    Я связывался с тех поддержкой фирмы МОХА в России, они ничем помочь не могут


    ExpandedWrap disabled
      bool volatile Prervat422Read, IsPotok422Read;
       
      Есть поток:
      UINT Com422PotokRead(LPVOID pParam)
      {
          IsPotok422Read=true;
      while (Prervat422Read == false)
      {
      …  Работа с СОМ422 портом фирмы МОХА
      }
      ...
      IsPotok422Read=false;
      }
       
      Есть функция ОК:
       
      void CPultSPNDlg::OnBnClickedOk()
      {
         Prervat422Read = true;
         while (IsPotok422Read == true)  Здесь падает система.
         {
          Sleep(100);
         };
      };


    Что я делаю не правильно?
      Цитата a_n_y_a @
      Что я делаю не правильно?

      На мой взгляд вообще всё.
      Но падает система явно не здесь. Скорее всего делаешь что-то неправильно при работе с портом, где-то в драйвере падает.

      Добавлено
      Кстати, при нажатии OK приложение скорее всего завершается, а завершения потока ты не ждёшь. Попробуй сделать в OnBnClickedOk, после цикла, WaitForSingleObject для потока
      Сообщение отредактировано: Олег М -
        Цитата Олег М @
        Цитата a_n_y_a @
        Что я делаю не правильно?

        На мой взгляд вообще всё.
        Но падает система явно не здесь. Скорее всего делаешь что-то неправильно при работе с портом, где-то в драйвере падает.

        Добавлено
        Кстати, при нажатии OK приложение скорее всего завершается, а завершения потока ты не ждёшь. Попробуй сделать в OnBnClickedOk, после цикла, WaitForSingleObject для потока

        Я не знаю как для потока сделать ожидание с помощью WaitForSingleObject.
        Если можешь, напиши пожалуйста код. Буду тебе очень благодарен.
          Цитата a_n_y_a @
          Я не знаю как для потока сделать ожидание с помощью WaitForSingleObject.
          Если можешь, напиши пожалуйста код. Буду тебе очень благодарен.

          ExpandedWrap disabled
            HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex.......
             
             
            void CPultSPNDlg::OnBnClickedOk()
            {
               Prervat422Read = true; //Сообщаем потоку, что пора завершаться
               ::WaitForSingleObject(hThread, INFINITE); //Ждём завершения потока
               ::CloseHandle(hThread); //Удаляем хендл
            };
            Цитата Олег М @
            Цитата a_n_y_a @
            Я не знаю как для потока сделать ожидание с помощью WaitForSingleObject.
            Если можешь, напиши пожалуйста код. Буду тебе очень благодарен.

            ExpandedWrap disabled
              HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex.......
               
               
              void CPultSPNDlg::OnBnClickedOk()
              {
                 Prervat422Read = true; //Сообщаем потоку, что пора завершаться
                 ::WaitForSingleObject(hThread, INFINITE); //Ждём завершения потока
                 ::CloseHandle(hThread); //Удаляем хендл
              };

            Я сделал:
            ExpandedWrap disabled
                  CWinThread *Pr;
               
               
                  Pr=AfxBeginThread(Com422PotokRead, this);

            И далее уже
            ExpandedWrap disabled
               ::WaitForSingleObject(Pr->m_..., INFINITE);


            Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически?

            Я поставил твой код, все работает и не падает. Большое спасибо за помощь.
              Цитата a_n_y_a @
              Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически?


              CloseHandle надо сделать чтобы очистить память.
                Цитата a_n_y_a @
                Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически?

                Нет, не удаляется. Будет утечка памяти, причём довольно большая - там остаётся стек потока
                  Цитата Олег М @
                  Цитата a_n_y_a @
                  Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически?

                  Нет, не удаляется. Будет утечка памяти, причём довольно большая - там остаётся стек потока

                  В моем случае достаточно сделать
                  ExpandedWrap disabled
                      delete Pr;


                  Или надо еще удалять хендл:
                  ExpandedWrap disabled
                      ::CloseHandle(Pr->m_...)


                  Или надо делать и то и другое?
                    Цитата a_n_y_a @
                    while (IsPotok422Read == true) Здесь падает система.
                    {
                    Sleep(100);
                    };


                    Никогда так не делай больше!

                    Добавлено
                    Цитата a_n_y_a @
                    Или надо еще удалять хендл:


                    Тебе уже говорят все. CloseHandle надо обязательно, ну и delete тоже конечно если там объект создавался динамические. Как бы если delete не сделать, то утечка памяти будет на порядки меньше.
                      Цитата Олег М @
                      Цитата a_n_y_a @
                      Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически?

                      Нет, не удаляется. Будет утечка памяти, причём довольно большая - там остаётся стек потока

                      А почему - стек ?
                      Хэндл можно закрыть сразу, если управлять потоком не нужно.
                      -----
                      ExpandedWrap disabled
                        void CPultSPNDlg::OnBnClickedOk()
                        {
                           Prervat422Read = true; //Сообщаем потоку, что пора завершаться
                           ::WaitForSingleObject(hThread, INFINITE); //Ждём завершения потока
                           ::CloseHandle(hThread); //Удаляем хендл
                        };

                      Это очень неудачный вариант. Его лучше избегать.
                      Сообщение отредактировано: ЫукпШ -
                        Цитата ЫукпШ @
                        Это очень неудачный вариант. Его лучше избегать.


                        Почему, в чём неудачность этого варианта?

                        Добавлено
                        Цитата ЫукпШ @
                        Хэндл можно закрыть сразу, если управлять потоком не нужно.


                        Вот это действительно неудачная и вредная фраза.
                        При вызове CloseHandle поток не будет остановлен, пока сам не завершится. Но лучше до завершения потока его не вызывать, потому что потеряешь контроль над потоком.
                          Отлаживаю программу, о которой идет речь. Программа останавливается на точке останова, я правлю код, жму Build, визуальная студия спрашивает остановить ли выполнение программы, я жму ОК, и система падает! Я работаю в VC++ 2017. Видимо те потоки, работающие с СОМ422 портом не закрываются автоматически. В этой ситуации можно что ни будь сделать?
                            Цитата a_n_y_a @
                            В этой ситуации можно что ни будь сделать?

                            Единственно, что ты можешь здесь сделать - это выяснить падает ли система из-за какой-то твоей ошибки, или драйверы устройства так реагируют на отладчик.
                            Для этого её надо раз сто запустить/остановить без отладчика, если упадёт - ошибка скорее всего у тебя.
                            И скомпилируй в релизе, проверь иоже.
                              В случае падения можно (при наличии виртуалки попробовать запустить его там), ну либо на другой машине.
                                Проверил в автономном запуске без студии. Завершаю программу через диспетчер задач. Система не падает! Дело в студии? Или диспетчер задач виртуально нажимает кнопку ОК или Cancel?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0445 ]   [ 17 queries used ]   [ Generated: 16.04.24, 14:53 GMT ]