Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-59325
Алексей
2002-10-29 08:59
2002.11.18
Интернет по почте


3-59004
Sers
2002-10-29 10:45
2002.11.18
Создать базу данных


1-59169
poratora
2002-11-09 08:41
2002.11.18
Не могу запустить Word


1-59237
DelphiDummy
2002-11-02 13:33
2002.11.18
Алгоритм шифрования ГОСТ-28147-89 на Delphi


1-59230
diww
2002-11-06 16:33
2002.11.18
как определить сетевое имя диска





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский