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

Вниз

WaitFor и TTread ы   Найти похожие ветки 

 
Граф   (2002-10-09 13:29) [0]

Господа, как правильно использовать функцию WaitFor в TTread"ах.
При использовании возникает 2 проблемы:
1. WaitFor исправно ждет окончания процесса в основном потоке, но в ходе ожидания нельзя работать с самой программой.
2. При окончании протока выдается ошибка "Неверный дескриптор" и дальнейший код не выполняется, хотя сама программа становиться доступной.
Вот сам код: //ScanTheNet - это и есть поток.

if not ScannedNetwork then
begin
ListBoxShareResources.Visible:=false;
WaitPanel.Visible:=true;
AnimateWhileScaning.Active:=true;
ScanTheNet.WaitFor;
ListBoxShareResources.Enabled:= true;
WaitPanel.Visible:=false;
AnimateWhileScaning.Active:=false;
end;
end;


 
Alx2   (2002-10-09 13:33) [1]

>1. WaitFor исправно ждет окончания процесса в основном потоке,
>но в ходе ожидания нельзя работать с самой программой.
Попробуй ждать из другого потока


 
Digitman   (2002-10-09 13:42) [2]

используй MsgWaitForMultipleObjects(), передав ей в кач-ве параметра (хэндла объекта синхронизации) ScanTheNet.Handle.

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

Если поток уже завершился и разрушен, ф-ция вернет WAIT_ABANDONED


 
Граф   (2002-10-09 14:09) [3]

Воспользовался твоим советом. Сделал так:
nbv:=ScanTheNet.Handle;
MsgWaitForMultipleObjects(1, nbv, False, INFINITE, QS_ALLINPUT);
В принципе работает, ошибки он больше не выдает, но работать с остальной формой по-прежнему не позволяет, и не прорисовывает панельку с просьбой подождать.
Есть подозрение. что я напутал с флагами dwWakeMask (выделено жирным).


 
Демонов Е.В.   (2002-10-09 14:11) [4]

>>2. При окончании протока выдается ошибка "Неверный дескриптор"
Наверно у тебы гдето стоит FreeOnTerminate:=True;


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




 
Digitman   (2002-10-09 14:29) [5]

>>MsgWaitForMultipleObjects(1, nbv, False, INFINITE, QS_ALLINPUT);

Это что, весь код ?

А где анализ и обработка результата ?


 
Polevi   (2002-10-09 14:32) [6]

цикл обработки сообщений нужен если ф-ия вернула
WAIT_OBJECT_0 + nCount
while PeekPessage(..,PM_REMOVE) do DispatchMessage

можешь посмотреть как сделано у борланда в проекте scktsrvr



 
REA   (2002-10-09 15:04) [7]

А может проще по событиям развесить? - как процесс завершится он OnTerminate вызвать должен.


 
Граф   (2002-10-09 15:32) [8]

to REA нет, так нельзя. Понимате, пользователь ткнул кнопку, появилось сообщение, что его "тыкание" обрабатывается и пошла обработка, а он может продолжать работать с остальными данными. Когда процесс обработки закончится, пользователь может работать и с результатом обработки
to Polevi Не нашел этот пример в демах. Может сможете привести этот кусок здесь в форуме или выслать по мейлу.
to Digitman Я в первый раз эту функцию использую, не понимаю что за анализ и обработка результата нужны. В хелпе ничего такого не указано.



 
Digitman   (2002-10-09 16:10) [9]

>В хелпе ничего такого не указано.

Да что ты говоришь ?) Да неуж-то Борланд облажался ?)


If the function succeeds, the return value indicates the event that caused the function to return. The successful return value is one of the following:

Value Meaning

WAIT_OBJECT_0 to (WAIT_OBJECT_0 + nCount - 1)

If fWaitAll is TRUE, the return value indicates that the state of all specified objects is signaled. If fWaitAll is FALSE, the return value minus WAIT_OBJECT_0 indicates the pHandles array index of the object that satisfied the wait.

WAIT_OBJECT_0 + nCount

Input of the type specified in the dwWakeMask parameter is available in the thread"s input queue.

WAIT_ABANDONED_0 to (WAIT_ABANDONED_0 + nCount - 1)

If fWaitAll is TRUE, the return value indicates that the state of all specified objects is signaled and at least one of the objects is an abandoned mutex object. If fWaitAll is FALSE, the return value minus WAIT_ABANDONED_0 indicates the pHandles array index of an abandoned mutex object that satisfied the wait.

WAIT_TIMEOUT

The time-out interval elapsed and the conditions specified by the fWaitAll and dwWakeMask parameters were not satisfied.


Ты указал
QS_ALLINPUT Any message is in the queue.

Это значит, что если ф-ция вернула управление с результатом
WAIT_OBJECT_0 + 1, очередь оконных сообщений вполне может быть и непуста, и ее нужно обработать, как предлагает, к примеру, Polevi


 
han_malign   (2002-10-09 16:30) [10]

1. Delphi\Source\Vcl\scktsrvr.pas - если поставил RTL
2. WaitFor... по любому тормозит процесс до "срабатывания" события (включая обработку событий от пользовательского интерфейса) и используется для синхронизации(при ожидании коротких транзакций в другом потоке, изменяющих общие данные)
3. Единственный способ не тормозить процесс до завершения потока это использование OnTerminate, если вы не можете этого сделать - значит интерфес разработан не грамотно(если на пальцах - текущие данные должны быть в пользовательском буфере, а по завершении потока, в буфер просто добавляются новые данные, или открывается новое поле или не модальная форма для работы с новыми данными)
4. Зачем нужен WaitForMultipleObjects если происходит ожидание всего одного события, для чего хватит всего WaitForSingleObject (в WaitForMultipleObjects возвращается WAIT_OBJECT_0+номер первого "сработавшего" события,либо WAIT_FAILED или WAIT_TIMEOUT если указан таймаут, а не INFINITE)



 
han_malign   (2002-10-09 16:37) [11]

Не заметил что MsgWaitFor, но тогда вообще смысла не вижу - зачем ожидать, что случится первым сообщение ввода или завершение потока, если новые данные можно обрабатывать только после завершения потока и нужен все тот же OnTerminate.


 
cypher   (2002-10-10 00:10) [12]

WaitFor останавливает работу до завершения работы потока. имхо ее нада использовать тока в деструкторе, типа:

MyThread.Terminate;
MyThread.WaitFor;

а вот определить, завершился ли поток лучше с помощью события OnTerminate

или я не понял вопрос? =)



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

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

Наверх





Память: 0.47 MB
Время: 0.008 c
3-68640
Lola
2002-09-25 14:21
2002.10.21
Memo-поля


4-69076
Jokle
2002-09-08 21:51
2002.10.21
DisableThreadLibraryCalls?


1-68837
KaPaT
2002-10-10 11:19
2002.10.21
Адресация в файле...


3-68642
Tornado
2002-09-27 09:25
2002.10.21
Мастерам. Подскажите


7-69033
Бахус
2002-08-10 16:43
2002.10.21
Как узнать серийный номер железа





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