На главную Наши проекты:
Журнал   ·   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 - появляется синий экран смерти.
    Цитата Олег М @
    При вызове CloseHandle поток не будет остановлен, пока сам не завершится.

    Ничего подобного.
    К остановке потока CloseHandle не имеет никакого отношения.
    Если будет взведён флаг, поток всё равно завершиться.
    Нельзя будет узнать будет статус потока.
    Но если это не нужно - можно и закрыть.

    Добавлено
    Цитата Олег М @
    Почему, в чём неудачность этого варианта?

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

    1. Для остановки потока автор пытается использовать переменную.
    Она точно "volatile" ?
    Если для этого имеются объекты ядра (а они имеются), лучше использовать их.
    Вот это и будет - правильно.
    2. Из обработчика кнопки автор пытается дождаться окончания потока.
    На время ожидания приложение будет просто парализовано.
    Хорошо, если потребуется 100 ms. А если 5000 ms ?
    3. Параметр INFINITE. А если в силу любых причин придётся ждать бесконечно ?
    (Особенно на этапе создания/отладки приложения)
    Приложение будет парализовано навсегда.
    Хотя без этого можно обойтись.
    Установим T-OUT, дождёмся результата ожидания. Если результат не успешен или ошибка -
    будем использовать "TerminateThread" и выдадим диагностику. Лучше так, чем просто
    зависнуть навсегда.
    4. CloseHandle. Это всегда можно забыть сделать. Поскольку используется очень часто,
    лучше сделать класс-оболочку вокруг HANDLE. Тогда многое станет проще и надёжнее.

    Автор явно не читал Рихтера. При создании таких приложений лучше почитать,
    тем более, что электронную версию найти не трудно.
    Сообщение отредактировано: ЫукпШ -
      Цитата ЫукпШ @
      1. Для остановки потока автор пытается использовать переменную.
      Она точно "volatile" ?

      Вроде у него там присутствует слово volatile, не уверен что на том месте.

      Цитата ЫукпШ @
      Если для этого имеются объекты ядра (а они имеются), лучше использовать их.
      Вот это и будет - правильно.

      Это на любителя.

      Да и всё остальное - тоже. В целом код более-менее правильный.

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

      Статус нафиг никому не нужен. Основное - всегда нужно ждать завершения потока, если ты закроешь хендл, то не сможешь этого сделать.
        Цитата Олег М @
        Это на любителя.

        Да и всё остальное - тоже. В целом код более-менее правильный.

        Ничего себе - на любителя.
        Откуда ты знаешь, какой он ?
        Приложение делается для юзера, а не для программёра.
        Программа может зависнуть без диагностики и автор
        прямым образом это делает. Далее, автор начнёт копировать это решение
        во все свои программы..
        Тогда это порочная любовь.
        ..Как же будет недоволен юзер, когда увидит ни на что не реагирующее окно..

        Добавлено
        Цитата Олег М @
        Статус нафиг никому не нужен. Основное - всегда нужно ждать завершения потока, если ты закроешь хендл, то не сможешь этого сделать.

        А я и не говорю, что это обязательно надо делать.
        Но это можно делать, если хочется.
        И со стеком потока CloseHandle никак не связан.
        Сообщение отредактировано: ЫукпШ -
          Проверил в автономном запуске без студии. Завершаю программу через диспетчер задач. Система не падает! Дело в студии? Или диспетчер задач виртуально нажимает кнопку ОК или Cancel?
            Цитата a_n_y_a @
            Проверил в автономном запуске без студии. Завершаю программу через диспетчер задач. Система не падает! Дело в студии? Или диспетчер задач виртуально нажимает кнопку ОК или Cancel?

            Надо завершать именно по нажатию кнопки OK/Cancel или зарывать окно.
            Там скорее всего не в студии проблема, а в том, что драйвер устройства как-то неправильно работает под отладчиком. К сожалению, я в этом тоже плохо разбираюсь.
              Цитата a_n_y_a @
              Завершаю программу через диспетчер задач. Система не падает! Дело в студии?

              Если программа "падает" так решительно и есть подозрение на драйвер,
              значит что можно посоветовать ?
              Очевидно, надо найти другую программу (-ы), использующую COM-порт.
              И попробовать её.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0371 ]   [ 17 queries used ]   [ Generated: 19.04.24, 18:16 GMT ]