Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Ответ программы на запросы пользователя (http://forum.oszone.net/showthread.php?t=90609)

EvgeniyQQQ 20-09-2007 17:16 646718

Ответ программы на запросы пользователя
 
Здравствуйте! Написал ресурсоемкое приложение выполняющее преобразование файлов из директории. В которой ну очень много файлов. При этом программа помещает в оперативную память просмотренные записи. Просматривая следующую запись, она проверяет на возможность дублирования этой записи. ...

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

Kerbit 20-09-2007 23:26 646906

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

DillerInc 21-09-2007 00:40 646929

Kerbit
Что-то уж больно накручено у вас,как мне кажется.

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

EvgeniyQQQ 25-09-2007 17:43 649321

Kerbit, DillerInc, спасибо!

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

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



Время: 11:07.

Время: 11:07.
© OSzone.net 2001-