Хочу на отдельной форме, желательно в модальной запустить прогрессбар, пока остновная софтина занята вычислениями.
Подскажите пример, если можно..что-то я завис..
Модератор: Модераторы
Снег Север писал(а):Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html
у каждого она разная. Кода то нет....но с точки зрения оптимальности или может даже правильности
- не надо это "трогать". Больше вопросов будет.StayOnTop
pupsik писал(а):arriah всё от задачи.
MysticCoder писал(а):Делаешь просто StayOnTop форму, показываешь её - Show; вешаешь на таймер какую нить функцию обновления прогрессбара, а в самих вычислениях периодически вызываешь Application.ProcessMessages. И все, никаких потоков не надо.
Если так хочется поток, то сами вычисления в поток кидай лучше
arriah писал(а):Снег Север писал(а):Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html
Тоже подумал о потоках, но с точки зрения оптимальности или может даже правильности - что будет лучше отправить в поток? Свою "долгоиграющую" процедуру? Или вызов модальной формы?
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, unit2;
...
//создадим класс потока
type
{ NewThread }
NewThread=class(TThread)
private
k:integer;
protected
procedure PrBar;
procedure Execute; override;
end;
//тут основная процедура потока
procedure NewThread.Execute;
var
i:integer;
begin
for i:=0 to 10000000 do begin
k:=i;
sleep(100);
Synchronize(@PrBar);
end;
end;
// процедура синхронизации
procedure NewThread.PrBar;
begin
Form2.ProgressBar1.Position:=k;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
FirstThread:NewThread;
begin
FirstThread:=NewThread.Create(false);
FirstThread.Priority:=tpNormal;;
Form2.ShowModal;
end;
Снег Север писал(а):Если программе надо ждать результатов основных вычислений, то их и делать в основном потоке. А прогресбар обрабатывать в дополнительном
arriah писал(а): я вот не помню где, читал, что главным правилом при работе с потоками в Lazarus является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.
pupsik писал(а):http://wiki.freepascal.org/Multithreaded_Application_Tutorial не достаточно?
Конкретно в вашем случае: "навесить" эвент на поток.
п.с.
Зачем модальное окно? Пользы никакой.
arriah писал(а):Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
MysticCoder писал(а):arriah писал(а):Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
Никто тебе не мешает передать имя файла, которое в таймере покажет прогрессбар.
т.е. только в этом польза модального окнаА если пользователь клацнет на основную форму, то окно с прогресбаром скроется))
Вернуться в Обучение Free Pascal
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5