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-04 15:48:00) [1]


>  GlobalsVar.UserId := GetPayServiceSoap.UserLogin(FrmConnect.
> EdUser.Text,FrmConnect.EdPassword.Text);

Это долгая операция??? ДА?? ТАк ее в доп. поток и помешай.........
А на форме только рисуй...


Пусик   (2006-08-04 13:42:00) [2]


> alles ©   (04.08.06 12:47) [38]


Значит, код неверный.


DiamondShark   (2006-08-04 13:20:00) [3]

Земляк, не пропускай при чтении слова.


alles   (2006-08-04 12:47:00) [4]

2 Пусик ©   (04.08.06 12:24) [36]
я пробовал в основном потоке но при выполнение этой строки Splash форма не прорисовается, да и вообще программа как-бы виснет
 GlobalsVar.UserId := GetPayServiceSoap.UserLogin(FrmConnect.EdUser.Text,FrmConnect.EdPassword.Text);


Пусик   (2006-08-04 12:27:00) [5]


> Palladin ©   (04.08.06 01:01) [29]
> фф топку... фместе с аффтаром экзампэла, на основе которого
> реализовалось показанное...ибо дырка через кою льется основной
> поток исполнения, ни фика не есть дуршлаг... а смысл дуршлага
> с дфуммя-тремя дырками просто теряется...


Сложное высказывание, особенно с падонкавской лексикой.
Сложное, и малопонятное.


Пусик   (2006-08-04 12:24:00) [6]


>  но для себя интереса просто интересно как это сделать


Очень просто.
В основном потоке создается и показывается splash-форма, дополнительный поток проводит длительные вычисления.


alles   (2006-08-04 12:19:00) [7]

> Он, опять же имхо, пошёл не туда и "вляпался" в потоки.
интересно, а никто из Вас даже не пытался никогда сделать активные(с роликом) Splash формы во время выполнения какой нибуть длительной операций. Может в инете где-то про это написанно. Можно канечьно оставить эту затею и использовать обычную форму, но для себя интереса просто интересно как это сделать


Kolan   (2006-08-04 11:15:00) [8]


> Да пойми ты одну простую вещь. "Показ" выполняется всегда
> в основном потоке!

Я понимаю. Кстати не всегда, просто VCL компоненты не потоко безопасны...


> Application.ProcessMessages

Понятно, можно и так, но поток - более верное решение, имхо.


Германн   (2006-08-04 01:54:00) [9]


> Вот я не пойму если надо:
>
> > оказывала, что программа не зависла, что "процесс" идёт
>
> и еще делать сам этот "процесс" - два дела... Это как без
> потоков одновременно сделать можно

Да пойми ты одну простую вещь. "Показ" выполняется всегдав основном потоке!
А уж как реализовать выполнение "процесса" - это другое дело. В основном потоке или в дополнительном. В первом варианте показ обеспечивается вызовом Application.ProcessMessages или Repaint, во втором - вызовом метода Synchronize.
Ещё надо сказать о "возможности" пользователя производить действия в программе, пока "процесс" ещё идёт. Нужно ли это? И если да, то в какой мере?


Kolan   (2006-08-04 01:30:00) [10]


> Он, опять же имхо, пошёл не туда и "вляпался" в потоки.


Вот я не пойму если надо:

> оказывала, что программа не зависла, что "процесс" идёт

и еще делать сам этот "процесс" - два дела... Это как без потоков одновременно сделать можно?


Германн   (2006-08-04 01:27:00) [11]


> и до сих пор не понятно, после 28 постов, чего там автор
> в потоке вообще собирается делать (по мимо синхронизации
> с основным потоком приложения, конечно)...
>

Имхо, автору нужна была Splash-форма, которая бы показывала, что программа не зависла, что "процесс" идёт и что надо просто подождать некоторое время пока сей процесс завершится. Он, опять же имхо, пошёл не туда и "вляпался" в потоки.


Kolan   (2006-08-04 01:24:00) [12]


> фф топку... фместе с аффтаром экзампэла

Это при

procedure TConnectThread.Execute;
begin
Sleep(10000); // Типа, большая одноразовая работа
end;

?


Palladin   (2006-08-04 01:01:00) [13]

фф топку... фместе с аффтаром экзампэла, на основе которого реализовалось показанное...

ибо дырка через кою льется основной поток исполнения, ни фика не есть дуршлаг... а смысл дуршлага с дфуммя-тремя дырками просто теряется... еслив конечно они не ждут/отправляют данные из/в блокирующий сокет или не пишут/читаю com порт.... или нечто подобное... в существовании которого я сильно сомневаюсь...

и до сих пор не понятно, после 28 постов, чего там автор в потоке вообще собирается делать (по мимо синхронизации с основным потоком приложения, конечно)...


Kolan   (2006-08-04 00:46:00) [14]


> FThread.FreeOnTerminate := true;

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

А так ,Имхо, это и есть верное решение.


DiamondShark   (2006-08-03 23:27:00) [15]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   FThread: TThread;
   procedure Form3Show(Sender: TObject);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Unit3, Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
 Form: TForm3;
begin
 Form := TForm3.Create(nil);
 Form.OnShow := Form3Show;
 FThread := TConnectThread.Create(true);
 FThread.FreeOnTerminate := true;
 FThread.OnTerminate := Form.ThreadTerminate;
 Form.ShowModal;
end;

procedure TForm1.Form3Show(Sender: TObject);
begin
 FThread.Resume;
end;

end.

==========================

unit Unit2;

interface

uses
 Classes;

type
 TConnectThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
 end;

implementation

uses
 Windows;

procedure TConnectThread.Execute;
begin
 Sleep(10000); // Типа, большая одноразовая работа
end;

end.

==========================

unit Unit3;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, StdCtrls, jpeg;

type
 TForm3 = class(TForm)
   Timer1: TTimer;
   Image1: TImage;
   Image2: TImage;
   procedure Timer1Timer(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 private
   FCanClose: Boolean;
 public
   procedure ThreadTerminate(Sender: TObject);
 end;

var
 Form3: TForm3;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm3.Timer1Timer(Sender: TObject);
begin
 Image1.Visible := not Image1.Visible;
 Image2.Visible := not Image2.Visible;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

procedure TForm3.ThreadTerminate(Sender: TObject);
begin
 FCanClose := true;
 Close;
end;

procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 CanClose := FCanClose;
end;

end.


DiamondShark   (2006-08-03 23:17:00) [16]

*бьёццо в бессильной злобе апстол*
Ну зачем же так бездумно пользоваться копипастом?!!


> а что не так в этом коде?

То, что это не код! Это иллюстрация, схема. Рассчитана не на копирование, а на изучениечеловеком (который, если верить биологам, дважды сапиенс). Желательно, вместе со всем сопутствующим текстом.
Тогда можно заметить, что в предыдущем абзаце написано: "Как правило, если поток предназначен для выполнения многократно повторяющегося кода (цикла), то в Execute используется конструкция следующего вида".
Понимаете? "Как правило...", что не есть "всегда", и "многократно повторяющегося".
Где у тебя многократно повторяющиеся шаги? Ты зачем цикл скопировал?
Ты комментарии прочитал? Троеточие видел? В человеческих текстах оно обычно означает "и ещё много-много всякой всячины".
Ты зачем просто выбросил то, что не смог понять?


> WaitFor() в Д7 этому не препятствует, судя по исходникам

Что, серьёзно? Ой-вэй... Мне всегда не нравилось заворачивание простых по сути вещей в тяжеленные обёртки. Насуют всякого, чего не просят...
В пятёрке WaitFor ничем подобным не занимается.


Германн   (2006-08-03 16:23:00) [17]


> Сергей М. ©   (03.08.06 15:56) [24]
>
> А Кариха я когда-нть прибью при встрече)
>

Спокойнее Сергей, спокойнее. Наш тезка из Самары тоже очень нервничал по этому поводу. И где он теперь?
:-)


Сергей М.   (2006-08-03 15:56:00) [18]

А Кариха я когда-нть прибью при встрече)


Сергей М.   (2006-08-03 15:55:00) [19]


> alles ©   (03.08.06 15:46) [20]


Хреново дело.
Можешь поиметь граблями по "мыслительному агрегату")

Убирай FreeOnTerminate = True, но при этом становись ответственным за уничтожение объекта..

ThreadConnect := TConnectThread.Create;
ThreadConnect.WaitFor; //пока ждем - события ввода-вывода GUI отрабатываются вовремя и в полной мере
РезультатРаботыПотока := ThreadConnect.ПолучитьРезультатРаботыПотока; //некий функц.метод, возвращающий результаты вычислений, проделанных доп.потоком
ThreadConnect.Free; //явно уничтожить объект - доп.поток - нам он больше не нужен


Kolan   (2006-08-03 15:47:00) [20]

Ну я же объяснил..

Запускаешь поток.
Он там себе работу свою делает, а ты в это время в главном рисуешь.
Как поток закончится возникнит событие... Kolan ©   (03.08.06 15:27) [17]в нем и проверяещь то, что тебе надо...
Для результата ожидания можно завести поле в потоке.

А лучьше не рисовать, а сделать gif картинку (имхо)...


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

Наверх

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