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

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

Как лучше организовать показ состояния процесса [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?


Наверх

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