Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.17.128] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ничего подобного. К остановке потока CloseHandle не имеет никакого отношения. Если будет взведён флаг, поток всё равно завершиться. Нельзя будет узнать будет статус потока. Но если это не нужно - можно и закрыть. Добавлено Во всём. 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. Тогда многое станет проще и надёжнее. Автор явно не читал Рихтера. При создании таких приложений лучше почитать, тем более, что электронную версию найти не трудно. |
Сообщ.
#17
,
|
|
|
Цитата ЫукпШ @ 1. Для остановки потока автор пытается использовать переменную. Она точно "volatile" ? Вроде у него там присутствует слово volatile, не уверен что на том месте. Цитата ЫукпШ @ Если для этого имеются объекты ядра (а они имеются), лучше использовать их. Вот это и будет - правильно. Это на любителя. Да и всё остальное - тоже. В целом код более-менее правильный. Добавлено Цитата ЫукпШ @ Нельзя будет узнать будет статус потока. Но если это не нужно - можно и закрыть. Статус нафиг никому не нужен. Основное - всегда нужно ждать завершения потока, если ты закроешь хендл, то не сможешь этого сделать. |
Сообщ.
#18
,
|
|
|
Цитата Олег М @ Это на любителя. Да и всё остальное - тоже. В целом код более-менее правильный. Ничего себе - на любителя. Откуда ты знаешь, какой он ? Приложение делается для юзера, а не для программёра. Программа может зависнуть без диагностики и автор прямым образом это делает. Далее, автор начнёт копировать это решение во все свои программы.. Тогда это порочная любовь. ..Как же будет недоволен юзер, когда увидит ни на что не реагирующее окно.. Добавлено Цитата Олег М @ Статус нафиг никому не нужен. Основное - всегда нужно ждать завершения потока, если ты закроешь хендл, то не сможешь этого сделать. А я и не говорю, что это обязательно надо делать. Но это можно делать, если хочется. И со стеком потока CloseHandle никак не связан. |
Сообщ.
#19
,
|
|
|
Проверил в автономном запуске без студии. Завершаю программу через диспетчер задач. Система не падает! Дело в студии? Или диспетчер задач виртуально нажимает кнопку ОК или Cancel?
|
Сообщ.
#20
,
|
|
|
Цитата a_n_y_a @ Проверил в автономном запуске без студии. Завершаю программу через диспетчер задач. Система не падает! Дело в студии? Или диспетчер задач виртуально нажимает кнопку ОК или Cancel? Надо завершать именно по нажатию кнопки OK/Cancel или зарывать окно. Там скорее всего не в студии проблема, а в том, что драйвер устройства как-то неправильно работает под отладчиком. К сожалению, я в этом тоже плохо разбираюсь. |
Сообщ.
#21
,
|
|
|
Цитата a_n_y_a @ Завершаю программу через диспетчер задач. Система не падает! Дело в студии? Если программа "падает" так решительно и есть подозрение на драйвер, значит что можно посоветовать ? Очевидно, надо найти другую программу (-ы), использующую COM-порт. И попробовать её. |