Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизКак лучше организовать показ состояния процесса Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c