Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
ВнизКак правильно дождаться завершения потока? Найти похожие ветки
← →
NewDelpher © (2004-10-29 10:29) [0]Пока есть вот такая мысль:
while WaitForSingleObject(MyProcess.Handle, 10) = WAIT_TIMEOUT do Application.ProcessMessages;
Но думаю, что это не есть правильно.
Подскажите, как надо?
← →
Reindeer Moss Eater © (2004-10-29 10:52) [1]Нажми F1 и узнай нужное значение второго пареаметра
← →
NewDelpher © (2004-10-29 11:00) [2]
> Reindeer Moss Eater © (29.10.04 10:52) [1]
> Нажми F1 и узнай нужное значение второго пареаметра
время ожидания в милисекундах. Если поток не завершился, значит функция вернет WAIT_TIMEOUT. И что?
← →
Reindeer Moss Eater © (2004-10-29 11:03) [3]И что?
Дед пихто.
У тебя таймаут 10 миллисекунд.
Ты ждешь своего потока не дольше десяти миллисекунд.
Нажми F1 и узнай нужное значение второго пареаметра
← →
NewDelpher © (2004-10-29 11:15) [4]
> У тебя таймаут 10 миллисекунд.
> Ты ждешь своего потока не дольше десяти миллисекунд.
А что нельзя? Надо ждать больше 10 милисекунд? И что значит нужное? Кому это оно нужно?
← →
Reindeer Moss Eater © (2004-10-29 11:17) [5]Ты свой вопрос читал? Или его за тебя твоя мама написала?
Как правильно дождаться завершения потока?
← →
NewDelpher © (2004-10-29 11:21) [6]
> Ты свой вопрос читал? Или его за тебя твоя мама написала?
И что тебе не нравится? Если не обрабатывать сообщения, то при выполнении WaitForSingleObject с "нужным значением" программа замирает.
← →
Reindeer Moss Eater © (2004-10-29 11:26) [7]И что?
А она должна анекдоты рассказывать во время ожидания?
Мне не нравится что в вопросе про это ничего не сказано.
← →
NewDelpher © (2004-10-29 11:27) [8]
> И что?
> А она должна анекдоты рассказывать во время ожидания?
> Мне не нравится что в вопросе про это ничего не сказано.
Она должна продолжать обрабатывать сообщения.
← →
Reindeer Moss Eater © (2004-10-29 11:28) [9]Твой код в вопросе же приведенный не обрабатывает их?
← →
NewDelpher © (2004-10-29 11:36) [10]
> Reindeer Moss Eater © (29.10.04 11:28) [9]
> Твой код в вопросе же приведенный не обрабатывает их?
Обрабатывает, но думал, мастера предложат какой-нибудь более "продвинутый" способ.
← →
Reindeer Moss Eater © (2004-10-29 11:42) [11]Но думаю, что это не есть правильно.
На основании чего тебе предложат более "правильный" способ?
Я предложу MsgWaitForMulty....
В ответ услышу, что так мол и так, все это зашибись, но мне вот тут еще надо вот это, а вот этого не хотелось бы.
И так далее.
← →
Digitman © (2004-10-29 11:47) [12]
> NewDelpher © (29.10.04 11:36) [10]
"продвинутый" способ - в станд.справке, прямо у тебя перед носом, если героически дочитать справку по WaitForSingleObject до конца :
If a thread creates any windows, it must process messages. DDE sends messages to all windows in the system. If you have a thread that uses a wait function with no time-out interval, the system will deadlock. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForSingleObject.
← →
NewDelpher © (2004-10-29 12:08) [13]
> MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx
А они чем отличаются?
← →
VMcL © (2004-10-29 12:10) [14]>>NewDelpher © (29.10.04 12:08) [13]
То есть сам справку читать ты упорно не желаешь?
← →
Zelius © (2004-10-29 12:12) [15]
> NewDelpher © (29.10.04 10:29)
Смотря какая задача стоит... Например, при завершении работы, поток может послать главному окну сообщение, тогда и ждать никого не надо, а просто отреагировать на это сообщение.
← →
Reindeer Moss Eater © (2004-10-29 12:13) [16]у него вообще не поток, а процесс отдельный
← →
NewDelpher © (2004-10-29 12:18) [17]
> То есть сам справку читать ты упорно не желаешь?
У меня про MsgWaitForMultipleObjectsEx в справке ничего нет (D5)
← →
NewDelpher © (2004-10-29 12:38) [18]Задача у меня такая. Дождаться когда поток завершиться и сразу продолжить работу. Читаем справку:
DWORD MsgWaitForMultipleObjects(
DWORD nCount, // number of handles in the object handle array
LPHANDLE pHandles, // pointer to the object-handle array
BOOL fWaitAll, // wait for all or wait for one
DWORD dwMilliseconds, // time-out interval in milliseconds
DWORD dwWakeMask // type of input events to wait for
);
здесь также указывается время в милисекундах, а если поток не завершится за это время, тогда что?
LPHANDLE pHandles - массив хэндлов объектов. А если я не знаю, сколько у меня объектов в данный момент работает?
← →
Reindeer Moss Eater © (2004-10-29 12:43) [19]Задача у меня такая. Дождаться когда поток завершиться и сразу продолжить работу.
А может не потока, а процесса?
← →
Digitman © (2004-10-29 13:01) [20]
> если поток не завершится за это время, тогда что?
во-первых, ты пытаешься дождаться завершения процесса, а не трэда.
если тайм-аут мал, то твоя программа продолжит выполнения со строчки, следующей за ф-цией ожидания.
> если я не знаю, сколько у меня объектов в данный момент
> работает?
как это "не знаешь" ?
тебя интересует состояние завершенности одного конкретного процесса ? вот хэндл этого процесса и есть объект синхронизации, и он один в дан.случае ! если вдруг захочешь ждать сигналы более чем одного объекта синхронизации, ты должен 2-м параметром передать адрес массива хэндлов этих объектов, а 1-м параметром - число элементов этого массива.
← →
NewDelpher © (2004-10-29 13:19) [21]
> если тайм-аут мал, то твоя программа продолжит выполнения
> со строчки, следующей за ф-цией ожидания.
Вот именно! А этого как раз и не надо. Надо, чтобы программа ждала, пока не завершится поток, и только потом уже переходила к следующей после Wait.. команде.
> как это "не знаешь" ?
> тебя интересует состояние завершенности одного конкретного
> процесса ?
Да, именно одного. У меня множество объектов, но каждого есть свой поток.
← →
Zelius © (2004-10-29 14:03) [22]
> NewDelpher © (29.10.04 13:19) [21]
Тогда зачем поток нужен? Потоки нужны тогда, когда программа должна продолжать работу, пока в потоке идет отдельное вычисление.
← →
NewDelpher © (2004-10-29 14:24) [23]
>
> Тогда зачем поток нужен? Потоки нужны тогда, когда программа
> должна продолжать работу, пока в потоке идет отдельное вычисление.
а у меня эти объекты - независимые, у каждого свои отдельные вычисления.
← →
Добрый дядька © (2004-10-29 14:26) [24]> NewDelpher ©
Ты бы лучше сформулировал подробнее свою задачу, тогда бы и ответили более предметно.
← →
NewDelpher © (2004-10-29 14:38) [25]
>
> Ты бы лучше сформулировал подробнее свою задачу, тогда бы
> и ответили более предметно.
Есть множество объектов. У каждого объекта свои функции, выполняющиеся в заданной последовательности. Каждая из функций выполняются в потоке, который создается перед выполнением функции и уничтожается после её выполнения.
← →
Reindeer Moss Eater © (2004-10-29 14:42) [26]Каждая из функций выполняются в потоке,
А какого тогда ... ты ждешь окончания процесса а не потока?
И если у тебя потоки, то зачем их ждать?
Сигнализируй по окончании оных главному потоку и ничего не жди.
← →
NewDelpher © (2004-10-29 14:54) [27]
> Сигнализируй по окончании оных главному потоку и ничего
> не жди.
а что WaitForSingleObject для потоков работать не будет? Просто я пример видел в инете, там как раз её использовали.
← →
Reindeer Moss Eater © (2004-10-29 15:06) [28]А нахрен такой поток, который надо ждать функцией ожидания?
Что изменится, если весь код его выполниться в главном потоке?
Бред какой-то напридумывал.
← →
Digitman © (2004-10-29 15:09) [29]
> Просто я пример видел в инете
слышал звон, да не знаешь где он !
> WaitForSingleObject для потоков работать не будет?
будет !
но ты же не хендл трэда передаешь как вх.параметр ф-ции ожидания, а хэндл процесса !!
"MyProcess.Handle" - ты написал ? или я ? или Пушкин ?
Значит таки речь о процессе идет, а не о трэде ?!
Или тебе строго по поясу, что "трэд", что "процесс" ? разницы вообще не видишь между этими понятиями и механизмами ?
← →
NewDelpher © (2004-10-29 15:14) [30]
> А нахрен такой поток, который надо ждать функцией ожидания?
> Что изменится, если весь код его выполниться в главном потоке?
> Бред какой-то напридумывал.
изменится всё. Если всё мои объекты будут последовательно выполнять свои функции в главном потоке, то ничего не получится. Т.е. один последовательно изменил у себя значение свойства "температура", а другой получил лишь конечное значение. А надо, чтобы у одного что-то непрерывно менялось, а другой на это реагировал. Количество объектов заранее не известно.
← →
NewDelpher © (2004-10-29 15:18) [31]
> "MyProcess.Handle" - ты написал ? или я ? или Пушкин ?
Прошу прощения. Я имел ввиду поток.
← →
Digitman © (2004-10-29 15:22) [32]
> NewDelpher © (29.10.04 15:14) [30]
однако, странный ты товарисч !
басню приснопамятного Крылова Иванандрейча про "ЛебедьРакомЩуку" помнишь ?
← →
Reindeer Moss Eater © (2004-10-29 15:23) [33]А надо, чтобы у одного что-то непрерывно менялось, а другой на это реагировал. Количество объектов заранее не известно.
Ну и зачем при этом чего-то ждать ?
← →
Digitman © (2004-10-29 15:26) [34]
> Прошу прощения. Я имел ввиду поток
ну и накой шут нужен такой поток ?
получается поход в гости к соседу по лестн.площадке через Китай !
ты стартовал какой-то доп.трэд и ждешь, пока он выполнит все что на него возложено, после чего продолжаешь выполнение алгоритма вызывающего трэда, пользуя окончательные выходные рез-ты работы доп.трэда.
ну и чем же это лучше однопоточной реализации алгоритма ?
← →
NewDelpher © (2004-10-29 15:29) [35]
>
> > NewDelpher © (29.10.04 15:14) [30]
>
>
> однако, странный ты товарисч !
>
> басню приснопамятного Крылова Иванандрейча про "ЛебедьРакомЩуку"
> помнишь ?
Да, стормозил. Но вопрос-то про поток был :)
> Ну и зачем при этом чего-то ждать ?
Как зачем, если в последовательности функций написано 1. "Нагреть до температуры N"
2. "Открыть клапан 2"
А если у меня температура N еще не достигнута, как я буду клапан открывать? Надо дождаться, пока до N нагреется.
← →
Reindeer Moss Eater © (2004-10-29 15:33) [36]Поток, проверяющий температуру, должен сингнализировать о том, что пора там чего-то открывать.
И не надо никого ждать.
← →
Digitman © (2004-10-29 15:37) [37]
> "Нагреть до температуры N"
это что, синхронная функция ?
← →
NewDelpher © (2004-10-29 15:42) [38]
> это что, синхронная функция ?
Ну да, причем она выполняется с определенной скоростью и эта скорость может меняться. В это время другой объект тоже "измеряет" эту температуру и тоже делает какие-то действия.
> Поток, проверяющий температуру, должен сингнализировать
> о том, что пора там чего-то открывать.
> И не надо никого ждать.
он есть, но в другом объекте.
← →
Digitman © (2004-10-29 15:50) [39]
> NewDelpher © (29.10.04 15:42) [38]
тогда RMD тебе правильно говорит : "нагревающий" трэд должен сигнализировать о каждом изменеии температуры нагреваемого объекта .. все прочие трэды, заинтересованные в получении нотификаций об изменениях температуры, должны просто "ловить" эти сигналы и по факту "поимки" делать своим "черные дела"
← →
Reindeer Moss Eater © (2004-10-29 15:51) [40]Ну да, причем она выполняется с определенной скоростью и эта скорость может меняться.
Тем более не надо ждать
DoWarm;
DoMore;
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.033 c