| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > зависает окно при обработке |
| Автор: mrgloom 29.6.2012, 10:20 | ||
| есть окно, на нём кнопка, на кнопке обработчик, в обработчике некоторая полезная работа которая требует времени. точнее там 2 кнопки старт и стоп, хотелось бы чтобы по кнопке стоп можно было остановить процесс, т.е. вообще его прервать(т.е. все данные чтобы остановились на предыдущем шаге) или же хотя бы дождаться завершения текущего шага зафиксировать переменные и остановится.
но проблема в том, что во время процедуры окно почему то замирает и даже кнопк астоп не нажимается не говоря уже о обновлении информации в окне. |
| Автор: vol4ek 29.6.2012, 16:54 | ||
Почитайте про потоки. |
| Автор: Earnest 2.7.2012, 08:56 | ||
Потоки, да, но тогда не получится
т.к. поток прерывается в любой момент. Ну то есть можно, но с доп. геморроем. В твоей ситуации лучше разбить задачу на шаги - она и так у тебя разбита, как я понимаю. Каждый шаг оформить как ф-ю какого-то класса, который будет хранить все состояние процесса (те самые переменные, которые ты хочешь зафиксировать), а дальше 2 варианта: 1) цикл, управляемый PickMessage-DispatchMessage с проверкой не пора ли остановиться после каждого шага. В принципе, здесь не обязательно выделять шаг в отдельную функцию, но сложнее добиться полной прозрачности цикла для действий пользователя 2) выполнять каждый шаг по какому-то сообщению, которое самому- же себе и посылать - асинхронно, конечно. Т.е. крутится обычный стандартный цикл обработки сообщений, который кнопки обрабатывает и т.д. Чтобы запустить рабочий процесс (по нажатию кнопки старт), посылаешь сообщение, по получении которого выполняешь один шаг и тут же посылаешь новое сообщение. По нажатию кнопки стоп просто ставим флаг bStop, например. А обработчик нашего шагового сообщения сначала проверяет флаг, а уже потом выполняет свою работу. Или не выполняет. Как-то так. |
| Автор: mrgloom 2.7.2012, 11:39 | ||||
| попробовал с циклом всё ок. но у меня не цикл, а некоторые действия(захват кадров) которые требуют некоторого времени. точнее у меня получается тоже цикл, только минимальные действие занимает несколько большее время, чем в цикле в примере.
так вот с такими единичными действиями тоже работает, но надо жать всё время на кнопку, у пользователя такое ощущение, что она зависла. треды наверно не желательны т.к. там питон вызывается, а из треда он может закапризничать. |
| Автор: mrgloom 2.7.2012, 13:10 | ||||||
решил вроде проблему так,
но проблема в том что когда нажимаешь стоп на форме, то состояние на форме сразу меняется, и не ждет окончания треда, а надо бы всё заморозить и дождаться окончания треда. или надо в на кнопку стоп повесить еще WaitForSingleObject ? Добавлено @ 13:16 но тогда непонятно почему строчка WaitForSingleObject выполняется и проходит сквозь неё, а только после этого выполняется возврат из треда? т.е. мне нужно чтобы мы подождали пока тред закончит итерацию и не делали до этого UpdateControl.
|
| Автор: mrgloom 2.7.2012, 15:24 | ||
| ну вообщем вопрос я решил путем добавления глобальной булевой переменной, и тред когда завершается проставляем этот флаг. а на обработчике кнопки стоп я добавил
и теперь при нажатии на кнопку стоп, всё зависает на нажатом её состоянии и ждет пока тред закончит. вообщем может и не самое лучшее решение, но я не знаю как по другому, теоретически можно менять статус на форме делать её не активной и выводить песочные часы. |
| Автор: mrgloom 5.7.2012, 16:41 | ||||||||
не могу понять как работает WaitForSingleObject.
а если WaitForSingleObject убрать то доходит до строчки
но дело в том, что на завершения треда нужно некоторое время и если закрыть окно до того как он завершится то будет мемори лик. т.е. проблема в том, что мне надо дождаться завершения треда, хотя наверно можно сделать кнопку закрыть неактивной, до того ка кон завершится , но это помоему не особо вариант. |
| Автор: mrgloom 6.7.2012, 14:48 | ||||
| http://forums.codeguru.com/showthread.php?305166-Windows-SDK-Thread-How-to-end-a-thread делал всё как тут, всё равно не хочет заходить в условие
а виснет на
|
| Автор: Dem_max 6.7.2012, 16:07 |
| INFINITE говорит что ожидать события бесконечно пока поток не завершится Добавлено через 1 минуту и 23 секунды WaitForSingleObject(myWinThread,MAX_TIME_TO_WAIT_THREAD); //почему не ждем? ждет на время MAX_TIME_TO_WAIT_THREAD при условии что поток не завершен и myWinThread валиден. |
| Автор: mrgloom 9.7.2012, 11:33 | ||
попробовал так же
так же на брекпоинт в треде не заходит, причем ни на какой. |
| Автор: mrgloom 10.7.2012, 12:04 | ||
| всё таки я не понял как работать с этим кодом для прерывания http://www.tenouk.com/visualcplusmfc/visualcplusmfc22.html
|
| Автор: Dem_max 12.7.2012, 06:33 |
| Не париться, вынести все вычисления в поток и окно не будет зависать. Все легко и просто. |