Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.18;
Скачать: CL | DM;

Вниз

Как лучше организовать показ состояния процесса   Найти похожие ветки 

 
AFrolov ©   (2002-11-06 11:36) [0]

Вопрос уже не новый, но все же:
Есть длительная процедура (для меня она черный ящик) которую мне надо применить к набору объектов. Как сделать так чтобы во время выполнения процедуры на форме отображалось время с начала процесса и пользователь имел возможность нажать кнопку пауза на той же форме.
На сколько я знаю для этого надо процедуру которая выполняет работу вынести в отдельный поток. Не подскажете ли как лучше всего все это организовать?
Заранее спасибо.


 
Внук ©   (2002-11-06 11:41) [1]

Для начала вопрос - этот "черный ящик" орудует объектами VCL?


 
Bis ©   (2002-11-06 11:43) [2]

по любому будет орудовать, раз вывод нужен


 
Skier ©   (2002-11-06 11:44) [3]

>AFrolov

> На сколько я знаю для этого надо процедуру которая выполняет
> работу вынести в отдельный поток.

Совершенно УГУ.
И если наботаешь с VCL - не забудь про Synchronize(...)


 
Внук ©   (2002-11-06 11:44) [4]

Не по-любому. Важно имеено то, что в "черном ящике" :)) И я так понимаю, что ее исходников нет?


 
AFrolov ©   (2002-11-06 11:47) [5]

2 > Внук © (06.11.02 11:44) Более того это вызов функции Com - объекта.



 
Внук ©   (2002-11-06 11:49) [6]

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


 
Alex4444444444   (2002-11-06 11:50) [7]

Ona dlitel"naya dlya KAZHDOGO objecta ili dlya nabora? Esli s odmin objectom mozhno podozhdat", to, mozhet, prosto Application.ProcessMessages mezhdu objectami?


 
AFrolov ©   (2002-11-06 12:02) [8]

И еще сразу 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;


 
AFrolov ©   (2002-11-06 12:04) [9]

> Alex4444444444 (06.11.02 11:50) она длительная для каждого объекта (приблизительно 1 минута) и просто Application.ProcessMessages(); не отделаешься.


 
Внук ©   (2002-11-06 12:10) [10]

Параметры передавать и возвращать лучше через переменные объекта TThread
А цикл я бы сделал типа
Sleep(10); if MyThread.Terminated...
потому как WaitFor здесь не очень подходит, imho.
Только этот флажок (Terminated) не забывать выставлять и не делать самоуничтожающийся поток.


 
Внук ©   (2002-11-06 12:11) [11]

И как все таки насчет VCL-объектов?
При этом

Thread:=TWorkThread.Create( True);
Передача параметров
TWorkThread.Resume



 
Skier ©   (2002-11-06 12:12) [12]

>AFrolov

> 1. Как лучше передавать параметры в поток, т.к. мне надо
> вызывать рабочую процедуру с параметрами и получить то что
> эта процедура вернула.

Можно передавать параметры в поток в его конструкторе.

> 2. как лучше дожидаться завершения выполнения метода Execute
> потока?

OnTerminate(...) ?



Страницы: 1 вся ветка

Текущий архив: 2002.11.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
7-59460
pwlusa
2002-05-07 21:50
2002.11.18
Как вставить файл в запущенное приложение?


6-59316
Legran
2002-09-22 18:01
2002.11.18
Любителям SQL и не только...


4-59470
PetroHobbit
2002-10-03 12:28
2002.11.18
Рабочий стол


1-59248
kc-action
2002-11-06 22:32
2002.11.18
Как.....


1-59186
123000
2002-11-09 14:06
2002.11.18
DLL & Graphics