Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подождать окончяние THread-a


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо