![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подождать окончяние THread-a
alles © (2006-08-03 14:40:00)Здраствуйте.
Я с THread-ами не так хорошо знаком и попрошу у Вас помощь.
На клиенте вызывается прцедура которая находится на сервере, это занимает много времени. Чтобы юзеру показать что программа не умерла, создал форму (FrmWait) на которой находится TImage где по таймеру меняются 3 картинки (ролик маленкий).
Делаю так:
GlobalsVar.UserId:=0; //integer variable
try
Application.CreateForm(TFrmWait, FrmWait);
FrmWait.Show;
{В этом THread-e получяем GlobalsVar.UserId}
ThreadConnect := TConnectThread.Create;
{как ожидать тут окончяние ThreadConnect-а и потом продолжить с if-ом ?}
if (GlobalsVar.UserId= 0) then
ShowMessage('Error');
finally
FrmWait.Release; FrmWait:=nil;
end;
при деббугер-е запускает TConnectThread и сразу программа пытается проверить GlobalsVar.UserId на 0 которая еще небыло присвоенно в TConnectThread.
Спасибо
Kolan (2006-08-03 15:46:00) [21]Ну я же объяснил..
Запускаешь поток.
Он там себе работу свою делает, а ты в это время в главном рисуешь.
Как поток закончится возникнит событие...Kolan © (03.08.06 15:27) [17]в нем и проверяещь то, что тебе надо... Для результата ожидания можно завести поле в потоке.
А лучьше не рисовать, а сделать gif картинку (имхо)...
alles (2006-08-03 15:46:00) [22]Сергей М. © (03.08.06 15:44) [19]
constructor TConnectThread.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
Self.Priority := tpHighest;
Resume;
end;
Сергей М. (2006-08-03 15:44:00) [23]WaitFor() в Д7 этому не препятствует, судя по исходникам ...
Лишь бы было понимание логики FreeOnTerminate-свойства, о коем ты не обмолвился ни словом ..
alles (2006-08-03 15:37:00) [24]> Не. Это явно не оттуда. Саша Панов не настолько глупый.
согласен я ошибся, не заметил 2-й THread
Хорошо, тогда не подскажите как правильно делать так чтобы программа ожидала окончяние функций
GlobalsVar.UserId := GetPayServiceSoap.UserLogin(FrmConnect.EdUser.Text,FrmConnect.EdPassword.Text);
и в это же время рисовала FrmWait?
Kolan (2006-08-03 15:27:00) [25]
WaitFor doesn't return until the thread terminates
Как я понял если ты этим воспользуешься то будешь ждать покак поток не завершится.. Тегда вопрос нах. вооюще доп. поток если ты его всеравно ждешь?
А вот событие:
OnTerminate(public) Occurs after the thread's Execute method has returned and before the thread is destroyed.
Сбудется как раз по завершении...
alles (2006-08-03 15:21:00) [26]Terminate
alles (2006-08-03 15:21:00) [27]>alles © (03.08.06 15:13) [12]
прочитать как
пробовал, не получяется. И TImage из FrmWait не прорисовается и TConnectThread не входит в TConnectThread:(
Kolan (2006-08-03 15:17:00) [28]По сабжу. Поток может просто отправить сообщение...
Германн (2006-08-03 15:14:00) [29]
> alles © (03.08.06 15:07) [9]
>
> 2 Германн © (03.08.06 14:56) [6]
> я на этой страницу прочитал
> http://www.delphimaster.ru/articles/panov/index.html#PageTop
> а что не так в этом коде?
>
Не. Это явно не оттуда. Саша Панов не настолько глупый.
Не так в этом коде всё! Если в методе Execute нет ничего, кроме вызова Synchronize, то пропадает полностью смысл дополнительного потока.
alles (2006-08-03 15:13:00) [30]2 Сергей М. © (03.08.06 15:07) [10]
пробовал, не получяется. И TImage из FrmWait не прорисовается и TConnectThread не входит в TConnectThread :(
Kolan (2006-08-03 15:08:00) [31]Кстати
> OnWork
измени наDoWork.. это же не событие
Сергей М. (2006-08-03 15:07:00) [32]Ничего там писать не надо.
Это метод, который нужно вызвать. чтобы дождаться завершения выполнения потока.
ThreadConnect := TConnectThread.Create;
ThreadConnect.WaitFor;
alles (2006-08-03 15:07:00) [33]2 Германн © (03.08.06 14:56) [6]
я на этой страницу прочитал
http://www.delphimaster.ru/articles/panov/index.html#PageTop
а что не так в этом коде?
alles (2006-08-03 15:01:00) [34]Сергей М, в этом случяе никак не могу понять что надо писАть в TThread.WaitFor, не подскажите?
Сергей М. (2006-08-03 15:01:00) [35]
> Германн © (03.08.06 14:56) [6]
Сие есть шедевр приснопамятного Николая Кариха, неотесаные статьи которого многие годы совращают начинающих с пути истинного)
Германн (2006-08-03 14:56:00) [36]
> procedure TConnectThread.Execute;
> begin
> while not Terminated do
> Synchronize(OnWork);
> end;
Где-то я уже это видел. :-)
Сергей М. (2006-08-03 14:50:00) [37]Все что творится в методе Terminate - взводится флаг Terminated, который у тебя собссно и проверяется в условии while-цикла как условие выхода из него.
Kolan (2006-08-03 14:49:00) [38]
Terminateпросто устанавливает флагTerminatedвTrue. Так что ставь где хочешь...
Сергей М. (2006-08-03 14:48:00) [39]Можно.
alles (2006-08-03 14:46:00) [40]Спасибо, и еще один вопрос:
procedure TConnectThread.Execute;
begin
while not Terminated do
Synchronize(OnWork);
end;
procedure TConnectThread.OnWork;
begin
GlobalsVar.UserId := GetPayServiceSoap.UserLogin(FrmConnect.EdUser.Text,FrmConnect.EdPassword.Text);
Terminate; <---МОЖНО ТУТ ПОСТАВИТЬ Terminate?
end;