Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.058 c
9-1088251752
Proger
2004-06-26 16:09
2004.11.14
Работа с памятью


4-1096978644
Delphi5.01
2004-10-05 16:17
2004.11.14
как программно поймать процесс изменения Modify


14-1098964273
NewDelpher
2004-10-28 15:51
2004.11.14
Воруют ли деньги операторы сотовой связи?


1-1099157002
S11.lhs7fy
2004-10-30 21:23
2004.11.14
Как отобразить строку в HEX


14-1098869396
X-Disa
2004-10-27 13:29
2004.11.14
Пишу графический редактор...