Войти

Показать полную графическую версию : Ответ программы на запросы пользователя


EvgeniyQQQ
20-09-2007, 17:16
Здравствуйте! Написал ресурсоемкое приложение выполняющее преобразование файлов из директории. В которой ну очень много файлов. При этом программа помещает в оперативную память просмотренные записи. Просматривая следующую запись, она проверяет на возможность дублирования этой записи. ...

Вопрос следующий. Как можно предусмотреть возможность остановки упомянутого процесса. Просто добавить кнопочку, которая при нажатии на неё меняет значение некоторой переменной (которую постоянно проверяет выполняющийся код программы) не получается. Приложение при запуске описанного процесса как бы вешается, то есть не отвечает на запросы пока не выполнит вышеупомянутые действия. Подскажите, пожалуйста, как быть?
Так же хочется, что бы окно программы не зависало.

Kerbit
20-09-2007, 23:26
Надо создать второй поток для этого процесса преобразования. А дальше копать в сторону синхронизации потоков. Например, можно создать mutex с помощью CreateMutex, затем в цикле обработки файлов можно попытаться захватить его и сразу отпустить функциями WaitForSingleObject и ReleaseMutex, а при нажатии на кнопку стоит просто попытаться захватить его той же WaitForSingleObject, тогда процесс преобразвания файлов остановится на своем вызове WaitForSingleObject.

DillerInc
21-09-2007, 00:40
Kerbit
Что-то уж больно накручено у вас,как мне кажется.

EvgeniyQQQ
Мне это представляется следующим образом.
Создаётся дополнительный поток функцией CreateThread,который выполняет в цикле ресурсоёмкую работу.При этом он постоянно проверяет состояние глобальной переменной.
Нажатие кнопки обрабатывается в оконной функции главного потока,в ходе чего глобальная переменная инициализируется значением TRUE.Здесь можно вызвать функцию WaitForSingleObject,передав ей описатель дополнительного потока.Тогда дополнительный поток,проверив в очередной раз значение глобальной переменной,производит необходимые действия(типа освобождения использованных ресурсов) и завершается.В ответ на это функция WaitForSingleObject,которую мы вызвали в главном потоке,возвращается.Ну,и дальше уже по смыслу программы.

EvgeniyQQQ
25-09-2007, 17:43
Kerbit, DillerInc, спасибо!

Проблема была решена добавлением в цикл преобразования файлов обработчика сообщений:

MSG message;
if(::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}




© OSzone.net 2001-2012