Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.124 c
3-1097840430
diabolik_krsk
2004-10-15 15:40
2004.11.14
Создание колонок DBGrid а во время прогона программы


14-1098339536
Гость
2004-10-21 10:18
2004.11.14
1C -8.0 против Delphi+FIBPlus+FB1.5


4-1096872425
vasili
2004-10-04 10:47
2004.11.14
Извлечение из ресурсов


14-1098952410
karat
2004-10-28 12:33
2004.11.14
Алгоритм встречи Нового года


1-1099426141
SteelMan
2004-11-02 23:09
2004.11.14
что за файл qtintf.dll





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский