Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Вниз

Дождаться завершения потока   Найти похожие ветки 

 
dj kondakov   (2011-08-26 10:21) [0]

Всем доброго времени суток!
Пишу инсталлер. Процесс извлечения и декомпрессии файлов реализую в отдельном от основного приложения потоке TThread. Проблема: нужно дождаться, пока поток завершит работу и продолжать выполнение основной программы, при этом в фоне выполняя перерисовку формы (чтобы программа не выглядела зависшей). Thread.WaitFor не катит - программа выполняется, но на время выполнения перестает отвечать на события системы. Как быть?


 
sniknik ©   (2011-08-26 10:33) [1]

> Пишу инсталлер.
готовый почему не взять? однозначно лучше будет.

> но на время выполнения перестает отвечать на события системы. Как быть?
перейти на "событийную логику", и думать соответственно... не линейно.


 
Медвежонок Пятачок ©   (2011-08-26 11:08) [2]

Вызвать функцию ожидания с обработкой сообщений.


 
dj kondakov   (2011-08-26 11:16) [3]


> готовый почему не взять? однозначно лучше будет.

Мне нужен инсталлер с минимальным набором функций. ВинРАР-SFX не то... Да и какой-никакой опыт приобрету.

> Вызвать функцию ожидания с обработкой сообщений.

Мне это ни о чем не говорит. Из функций ожидания знаю только Sleep(); и WaitFor. Первая тут в любом случае не подходит, вторая, как уже говорилось, не дает нужного результата. Можно чуть поподробнее?


 
dj kondakov   (2011-08-26 11:18) [4]

Раньше делал просто - есть некая булевская переменная, которая встает в true по завершении потока, а в основной программе - таймер, который проверяет значение этой переменной. Если она true - выполняемся дальше.
Только чует моя пятая точка, что есть выход поизящнее...


 
sniknik ©   (2011-08-26 11:20) [5]

> Вызвать функцию ожидания с обработкой сообщений.
а зачем?

вот у тебя форма "инсталлера" кнопки "далее", "назад" по входу запускается поток "Процесс извлечения и декомпрессии"... ожидаем завершения но даем функцией обработку событий, и кто-то нажал кнопку "далее" не дожидаясь... форма должна поменяться но по коду, еще не вышла из обработчика прошлой, поэтому если ее например закрыть, то выходу нас ждет AV.

чтобы не было подобного, нужно будет запретить кнопки (часть событий), до завершения, что фактически равнозначно блокированию кнопок, и "не ожиданию", а простому разблокированию по событию завершения потока.
т.е. вместо того чтобы что-то дополнительно делать, можно вообще ничего не делать с тем же результатом. просто код в правильных местах писать (по событиям, а не сплошняком в обработчиках, с прерываниями его другими событиями)


 
Медвежонок Пятачок ©   (2011-08-26 11:24) [6]

Мне это ни о чем не говорит.

А зачем тогда взялся?
Не говорит - крути тогда тупой пустой цикл со слипами


 
Медвежонок Пятачок ©   (2011-08-26 11:26) [7]

чтобы не было подобного, нужно будет запретить кнопки

Ты так говоришь, словно знаешь что у него там дизайн именно такой.
Хотя очень может быть, что в коде сразу после создания потока выполняется еще код, напрямую зависящий от результатов потока.


 
sniknik ©   (2011-08-26 11:27) [8]

> Мне нужен инсталлер с минимальным набором функций.
а с максимальным не пойдет? - Inno Setup можно даже программу на нем написать...


 
Медвежонок Пятачок ©   (2011-08-26 11:28) [9]

Раньше делал просто - есть некая булевская переменная, которая встает в true по завершении потока, а в основной программе - таймер,

Вот видишь, сникник, какой полет мысли.

Если ждать, то нужен таймер.
Ведь "ждать" - это "время", а на таймере как раз часики нарисованы.


 
sniknik ©   (2011-08-26 11:29) [10]

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

> напрямую зависящий от результатов потока.
почему не выполнить его в событии завершения потока?


 
OW ©   (2011-08-26 13:07) [11]

procedure buttonNextEnable; message WM_USER + XX;
--buttonNext.Enable := true;

Programm
--buttonNext.Enable := false;
--Run_Thread

Thread
--DdWork;
--Sendmessage(КтоЖдет, WM_USER + XX, ..


 
dj kondakov   (2011-08-26 13:44) [12]

Хм... Убрал WaitFor, выполняемые после распаковки действия перенес в конец метода execute. Приложение все равно "подвисает". Что за фигня??


 
sniknik ©   (2011-08-26 13:45) [13]

> Что за фигня??
Архангельский?


 
dj kondakov   (2011-08-26 13:49) [14]

Все, разобрался) Спасибо всем за идеи)


 
Anatoly Podgoretsky ©   (2011-08-26 14:47) [15]

> dj kondakov  (26.08.2011 10:21:00)  [0]

У потока есть событие окончания.


 
Anatoly Podgoretsky ©   (2011-08-26 14:50) [16]

> sniknik  (26.08.2011 11:29:10)  [10]

Наверно, но для этого мозги надо повернуть в сторону событийного
программирования.
Точно также многим тяжело переходить с Инди на ICS - мозги не такие, прямые
без изгибов


 
Anatoly Podgoretsky ©   (2011-08-26 14:50) [17]

> dj kondakov  (26.08.2011 13:44:12)  [12]

Значит по Архангельски написал


 
Anatoly Podgoretsky ©   (2011-08-26 14:54) [18]

> sniknik  (26.08.2011 13:45:13)  [13]

Мысли паралельно двигаются, и не по Архангельски :-)


 
Anatoly Podgoretsky ©   (2011-08-26 14:55) [19]

> dj kondakov  (26.08.2011 13:49:14)  [14]

Ну и чего не ужели не скажешь в чем проблема была, или тебе интересен только
свой проект?


 
dj kondakov   (2011-08-27 09:57) [20]

А я так и не понял, почему у меня тогда приложение "подвисло". Сделал просто: по нажатию на кнопку "Установить" создается объект потока, которому передаются в качестве переменных все необходимые данные, и поток запускается. Поток извлекает файлы, и, когда заканчивает работу, вызывает метод EndInstall главной формы, в котором уже прописаны все действия, происходящие после распаковки (создание ярлыков и прочее). Собственно, и все. Просто после очередного запуска обнаружил, что программа не "висит", а вполне корректно реагирует на нажатие кнопки "Отмена".



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
2-1314252487
Onyx2012
2011-08-25 10:08
2011.12.11
Фильтр по значению в Express Quantum Grid


2-1314601549
alexdn
2011-08-29 11:05
2011.12.11
Tms меню компонент


4-1242382646
Игорь
2009-05-15 14:17
2011.12.11
Функция IsProcessInJob в Windows 2000


2-1313944939
анонимус
2011-08-21 20:42
2011.12.11
(Y:=0.3*R+0.59*G+0.11*B)


2-1314338415
Gevs
2011-08-26 10:00
2011.12.11
Мышь





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский