![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как лучше организовать показ состояния процесса [D6]
AFrolov © (2002-11-06 11:36:00)Вопрос уже не новый, но все же:
Есть длительная процедура (для меня она черный ящик) которую мне надо применить к набору объектов. Как сделать так чтобы во время выполнения процедуры на форме отображалось время с начала процесса и пользователь имел возможность нажать кнопку пауза на той же форме.
На сколько я знаю для этого надо процедуру которая выполняет работу вынести в отдельный поток. Не подскажете ли как лучше всего все это организовать?
Заранее спасибо.
Skier (2002-11-06 12:12:00) [1]>AFrolov
> 1. Как лучше передавать параметры в поток, т.к. мне надо
> вызывать рабочую процедуру с параметрами и получить то что
> эта процедура вернула.
Можно передавать параметры в поток в его конструкторе.
> 2. как лучше дожидаться завершения выполнения метода Execute
> потока?
OnTerminate(...) ?
Внук (2002-11-06 12:11:00) [2]И как все таки насчет VCL-объектов?
При этом
Thread:=TWorkThread.Create( True);
Передача параметров
TWorkThread.Resume
Внук (2002-11-06 12:10:00) [3]Параметры передавать и возвращать лучше через переменные объекта TThread
А цикл я бы сделал типа
Sleep(10); if MyThread.Terminated...
потому как WaitFor здесь не очень подходит, imho.
Только этот флажок (Terminated) не забывать выставлять и не делать самоуничтожающийся поток.
AFrolov (2002-11-06 12:04:00) [4]> Alex4444444444 (06.11.02 11:50)она длительная для каждого объекта (приблизительно 1 минута) и просто
Application.ProcessMessages();не отделаешься.
AFrolov (2002-11-06 12:02:00) [5]И еще сразу 2 вопроса:
1. Как лучше передавать параметры в поток, т.к. мне надо вызывать рабочую процедуру с параметрами и получить то что эта процедура вернула.
2. как лучше дожидаться завершения выполнения метода Execute потока?
Вот примерная схема как я это себе представляю (если она не лучшая подскажите другую):
//Код метода Execute потока
procedure TWorkThread.Execute;
begin
MyProc(...);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Thread:TWorkThread;
begin
for i:=1 to count do
begin
Thread:=TWorkThread.Create(false);
// передача параметров
While () //Здесь надо узнавать работает ли еще метод execute у потока
begin
Application.ProcessMessages();//Чтобы пользователь мог кнопки жать
..// показ времени
end;
//Здесь хотелось бы получить результаты работы потока
Thread.Destroy();
end;
end;
Alex4444444444 (2002-11-06 11:50:00) [6]Ona dlitel"naya dlya KAZHDOGO objecta ili dlya nabora? Esli s odmin objectom mozhno podozhdat", to, mozhet, prosto Application.ProcessMessages mezhdu objectami?
Внук (2002-11-06 11:49:00) [7]Если эта функция использует объекты VCL, помещать в отдельный поток бесмысленно, ибо все равно придется синхронизировать с главным...
В противном случае можно говорить дальше...
AFrolov (2002-11-06 11:47:00) [8]2 > Внук © (06.11.02 11:44)Более того это вызов функции Com - объекта.
Skier (2002-11-06 11:44:00) [9]>AFrolov
> На сколько я знаю для этого надо процедуру которая выполняет
> работу вынести в отдельный поток.
Совершенно УГУ.
И если наботаешь с VCL - не забудьпро Synchronize(...)
Внук (2002-11-06 11:44:00) [10]Не по-любому. Важно имеено то, что в "черном ящике" :)) И я так понимаю, что ее исходников нет?
Bis (2002-11-06 11:43:00) [11]по любому будет орудовать, раз вывод нужен
Внук (2002-11-06 11:41:00) [12]Для начала вопрос - этот "черный ящик" орудует объектами VCL?