![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дождаться завершения потока [D7]
dj kondakov © (2011-08-26 10:21:00)Всем доброго времени суток!
Пишу инсталлер. Процесс извлечения и декомпрессии файлов реализую в отдельном от основного приложения потоке TThread. Проблема: нужно дождаться, пока поток завершит работу и продолжать выполнение основной программы, при этом в фоне выполняя перерисовку формы (чтобы программа не выглядела зависшей). Thread.WaitFor не катит - программа выполняется, но на время выполнения перестает отвечать на события системы. Как быть?
dj kondakov (2011-08-27 09:57:00) [1]А я так и не понял, почему у меня тогда приложение "подвисло". Сделал просто: по нажатию на кнопку "Установить" создается объект потока, которому передаются в качестве переменных все необходимые данные, и поток запускается. Поток извлекает файлы, и, когда заканчивает работу, вызывает метод EndInstall главной формы, в котором уже прописаны все действия, происходящие после распаковки (создание ярлыков и прочее). Собственно, и все. Просто после очередного запуска обнаружил, что программа не "висит", а вполне корректно реагирует на нажатие кнопки "Отмена".
Anatoly Podgoretsky (2011-08-26 14:55:00) [2]> dj kondakov (26.08.2011 13:49:14) [14]
Ну и чего не ужели не скажешь в чем проблема была, или тебе интересен только
свой проект?
Anatoly Podgoretsky (2011-08-26 14:54:00) [3]> sniknik (26.08.2011 13:45:13) [13]
Мысли паралельно двигаются, и не по Архангельски :-)
Anatoly Podgoretsky (2011-08-26 14:50:00) [4]> dj kondakov (26.08.2011 13:44:12) [12]
Значит по Архангельски написал
Anatoly Podgoretsky (2011-08-26 14:50:00) [5]> sniknik (26.08.2011 11:29:10) [10]
Наверно, но для этого мозги надо повернуть в сторону событийного
программирования.
Точно также многим тяжело переходить с Инди на ICS - мозги не такие, прямые
без изгибов
Anatoly Podgoretsky (2011-08-26 14:47:00) [6]> dj kondakov (26.08.2011 10:21:00) [0]
У потока есть событие окончания.
dj kondakov (2011-08-26 13:49:00) [7]Все, разобрался) Спасибо всем за идеи)
sniknik (2011-08-26 13:45:00) [8]> Что за фигня??
Архангельский?
dj kondakov (2011-08-26 13:44:00) [9]Хм... Убрал WaitFor, выполняемые после распаковки действия перенес в конец метода execute. Приложение все равно "подвисает". Что за фигня??
OW (2011-08-26 13:07:00) [10]procedure buttonNextEnable; message WM_USER + XX;
--buttonNext.Enable := true;
Programm
--buttonNext.Enable := false;
--Run_Thread
Thread
--DdWork;
--Sendmessage(КтоЖдет, WM_USER + XX, ..
sniknik (2011-08-26 11:29:00) [11]> Ты так говоришь, словно знаешь что у него там дизайн именно такой.
не знаю конечно, но "в общем" и просто принцип, придется запрещать все не разрешённое, что может по действиям привести к краху.
> напрямую зависящий от результатов потока.
почему не выполнить его в событии завершения потока?
Медвежонок Пятачок (2011-08-26 11:28:00) [12]Раньше делал просто - есть некая булевская переменная, которая встает в true по завершении потока, а в основной программе - таймер,
Вот видишь, сникник, какой полет мысли.
Если ждать, то нужен таймер.
Ведь "ждать" - это "время", а на таймере как раз часики нарисованы.
sniknik (2011-08-26 11:27:00) [13]> Мне нужен инсталлер с минимальным набором функций.
а с максимальным не пойдет? - Inno Setup можно даже программу на нем написать...
Медвежонок Пятачок (2011-08-26 11:26:00) [14]чтобы не было подобного, нужно будет запретить кнопки
Ты так говоришь, словно знаешь что у него там дизайн именно такой.
Хотя очень может быть, что в коде сразу после создания потока выполняется еще код, напрямую зависящий от результатов потока.
Медвежонок Пятачок (2011-08-26 11:24:00) [15]Мне это ни о чем не говорит.
А зачем тогда взялся?
Не говорит - крути тогда тупой пустой цикл со слипами
sniknik (2011-08-26 11:20:00) [16]> Вызвать функцию ожидания с обработкой сообщений.
а зачем?
вот у тебя форма "инсталлера" кнопки "далее", "назад" по входу запускается поток "Процесс извлечения и декомпрессии"... ожидаем завершения но даем функцией обработку событий, и кто-то нажал кнопку "далее" не дожидаясь... форма должна поменяться но по коду, еще не вышла из обработчика прошлой, поэтому если ее например закрыть, то выходу нас ждет AV.
чтобы не было подобного, нужно будет запретить кнопки (часть событий), до завершения, что фактически равнозначно блокированию кнопок, и "не ожиданию", а простому разблокированию по событию завершения потока.
т.е. вместо того чтобы что-то дополнительно делать, можно вообще ничего не делать с тем же результатом. просто код в правильных местах писать (по событиям, а не сплошняком в обработчиках, с прерываниями его другими событиями)
dj kondakov (2011-08-26 11:18:00) [17]Раньше делал просто - есть некая булевская переменная, которая встает в true по завершении потока, а в основной программе - таймер, который проверяет значение этой переменной. Если она true - выполняемся дальше.
Только чует моя пятая точка, что есть выход поизящнее...
dj kondakov (2011-08-26 11:16:00) [18]
> готовый почему не взять? однозначно лучше будет.
Мне нужен инсталлер с минимальным набором функций. ВинРАР-SFX не то... Да и какой-никакой опыт приобрету.
> Вызвать функцию ожидания с обработкой сообщений.
Мне это ни о чем не говорит. Из функций ожидания знаю только Sleep(); и WaitFor. Первая тут в любом случае не подходит, вторая, как уже говорилось, не дает нужного результата. Можно чуть поподробнее?
Медвежонок Пятачок (2011-08-26 11:08:00) [19]Вызвать функцию ожидания с обработкой сообщений.
sniknik (2011-08-26 10:33:00) [20]> Пишу инсталлер.
готовый почему не взять? однозначно лучше будет.
> но на время выполнения перестает отвечать на события системы. Как быть?
перейти на "событийную логику", и думать соответственно... не линейно.