Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.40.207] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Есть следующий код. В функции ОК падает Windows 10, появляется синий экран смерти с сообщением кода остановки системы.
Я связывался с тех поддержкой фирмы МОХА в России, они ничем помочь не могут 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); }; }; Что я делаю не правильно? |
Сообщ.
#2
,
|
|
|
Цитата a_n_y_a @ Что я делаю не правильно? На мой взгляд вообще всё. Но падает система явно не здесь. Скорее всего делаешь что-то неправильно при работе с портом, где-то в драйвере падает. Добавлено Кстати, при нажатии OK приложение скорее всего завершается, а завершения потока ты не ждёшь. Попробуй сделать в OnBnClickedOk, после цикла, WaitForSingleObject для потока |
Сообщ.
#3
,
|
|
|
Цитата Олег М @ Цитата a_n_y_a @ Что я делаю не правильно? На мой взгляд вообще всё. Но падает система явно не здесь. Скорее всего делаешь что-то неправильно при работе с портом, где-то в драйвере падает. Добавлено Кстати, при нажатии OK приложение скорее всего завершается, а завершения потока ты не ждёшь. Попробуй сделать в OnBnClickedOk, после цикла, WaitForSingleObject для потока Я не знаю как для потока сделать ожидание с помощью WaitForSingleObject. Если можешь, напиши пожалуйста код. Буду тебе очень благодарен. |
Сообщ.
#4
,
|
|
|
Цитата a_n_y_a @ Я не знаю как для потока сделать ожидание с помощью WaitForSingleObject. Если можешь, напиши пожалуйста код. Буду тебе очень благодарен. HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex....... void CPultSPNDlg::OnBnClickedOk() { Prervat422Read = true; //Сообщаем потоку, что пора завершаться ::WaitForSingleObject(hThread, INFINITE); //Ждём завершения потока ::CloseHandle(hThread); //Удаляем хендл }; |
Сообщ.
#5
,
|
|
|
Цитата Олег М @ Цитата a_n_y_a @ Я не знаю как для потока сделать ожидание с помощью WaitForSingleObject. Если можешь, напиши пожалуйста код. Буду тебе очень благодарен. HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex....... void CPultSPNDlg::OnBnClickedOk() { Prervat422Read = true; //Сообщаем потоку, что пора завершаться ::WaitForSingleObject(hThread, INFINITE); //Ждём завершения потока ::CloseHandle(hThread); //Удаляем хендл }; Я сделал: CWinThread *Pr; Pr=AfxBeginThread(Com422PotokRead, this); И далее уже ::WaitForSingleObject(Pr->m_..., INFINITE); Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически? Я поставил твой код, все работает и не падает. Большое спасибо за помощь. |
Сообщ.
#6
,
|
|
|
Цитата a_n_y_a @ Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически? CloseHandle надо сделать чтобы очистить память. |
Сообщ.
#7
,
|
|
|
Цитата a_n_y_a @ Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически? Нет, не удаляется. Будет утечка памяти, причём довольно большая - там остаётся стек потока |
Сообщ.
#8
,
|
|
|
Цитата Олег М @ Цитата a_n_y_a @ Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически? Нет, не удаляется. Будет утечка памяти, причём довольно большая - там остаётся стек потока В моем случае достаточно сделать delete Pr; Или надо еще удалять хендл: ::CloseHandle(Pr->m_...) Или надо делать и то и другое? |
Сообщ.
#9
,
|
|
|
Цитата a_n_y_a @ while (IsPotok422Read == true) Здесь падает система. { Sleep(100); }; Никогда так не делай больше! Добавлено Цитата a_n_y_a @ Или надо еще удалять хендл: Тебе уже говорят все. CloseHandle надо обязательно, ну и delete тоже конечно если там объект создавался динамические. Как бы если delete не сделать, то утечка памяти будет на порядки меньше. |
Сообщ.
#10
,
|
|
|
Цитата Олег М @ Цитата a_n_y_a @ Вопрос, а удалять хендл обязательно? Если поток закрылся, может хендл удаляется автоматически? Нет, не удаляется. Будет утечка памяти, причём довольно большая - там остаётся стек потока А почему - стек ? Хэндл можно закрыть сразу, если управлять потоком не нужно. ----- void CPultSPNDlg::OnBnClickedOk() { Prervat422Read = true; //Сообщаем потоку, что пора завершаться ::WaitForSingleObject(hThread, INFINITE); //Ждём завершения потока ::CloseHandle(hThread); //Удаляем хендл }; Это очень неудачный вариант. Его лучше избегать. |
Сообщ.
#11
,
|
|
|
Цитата ЫукпШ @ Это очень неудачный вариант. Его лучше избегать. Почему, в чём неудачность этого варианта? Добавлено Цитата ЫукпШ @ Хэндл можно закрыть сразу, если управлять потоком не нужно. Вот это действительно неудачная и вредная фраза. При вызове CloseHandle поток не будет остановлен, пока сам не завершится. Но лучше до завершения потока его не вызывать, потому что потеряешь контроль над потоком. |
Сообщ.
#12
,
|
|
|
Отлаживаю программу, о которой идет речь. Программа останавливается на точке останова, я правлю код, жму Build, визуальная студия спрашивает остановить ли выполнение программы, я жму ОК, и система падает! Я работаю в VC++ 2017. Видимо те потоки, работающие с СОМ422 портом не закрываются автоматически. В этой ситуации можно что ни будь сделать?
|
Сообщ.
#13
,
|
|
|
Цитата a_n_y_a @ В этой ситуации можно что ни будь сделать? Единственно, что ты можешь здесь сделать - это выяснить падает ли система из-за какой-то твоей ошибки, или драйверы устройства так реагируют на отладчик. Для этого её надо раз сто запустить/остановить без отладчика, если упадёт - ошибка скорее всего у тебя. И скомпилируй в релизе, проверь иоже. |
Сообщ.
#14
,
|
|
|
В случае падения можно (при наличии виртуалки попробовать запустить его там), ну либо на другой машине.
|
Сообщ.
#15
,
|
|
|
Проверил в автономном запуске без студии. Завершаю программу через диспетчер задач. Система не падает! Дело в студии? Или диспетчер задач виртуально нажимает кнопку ОК или Cancel?
|