Страница 1 из 2
Progressbar
Добавлено: 16.07.2016 10:20:21
arriah
Хочу на отдельной форме, желательно в модальной запустить прогрессбар, пока остновная софтина занята вычислениями.
Подскажите пример, если можно..что-то я завис..
Re: Progressbar
Добавлено: 16.07.2016 15:08:31
Снег Север
Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html
Re: Progressbar
Добавлено: 16.07.2016 20:45:52
arriah
Тоже подумал о потоках, но с точки зрения оптимальности или может даже правильности - что будет лучше отправить в поток? Свою "долгоиграющую" процедуру? Или вызов модальной формы?
Re: Progressbar
Добавлено: 16.07.2016 20:52:06
MysticCoder
Делаешь просто StayOnTop форму, показываешь её - Show; вешаешь на таймер какую нить функцию обновления прогрессбара, а в самих вычислениях периодически вызываешь Application.ProcessMessages. И все, никаких потоков не надо.
Если так хочется поток, то сами вычисления в поток кидай лучше
Re: Progressbar
Добавлено: 16.07.2016 21:12:54
pupsik
arriah всё от задачи.
1- Имитация прогресса. И пока функция не закончит работу... имитировать бурную деятельность.
2. Запихнуть работу в поток и выводить "тихим" прогрессом. Т.е. без всяких диалогов. Зафризив необходимое.
3. ВинАПИ в подмогу. С его помощью можно сделать многое. В т.ч. и диалоог с прогрессом.
п.с.
но с точки зрения оптимальности или может даже правильности
у каждого она разная. Кода то нет....
StayOnTop
- не надо это "трогать". Больше вопросов будет.
Re: Progressbar
Добавлено: 16.07.2016 21:24:15
arriah
pupsik писал(а):arriah всё от задачи.
На данные момент работает так:
Программа получает массу ссылок на изображения, обрабатывает их, и заливает по фтп на другой сервер.. Изображений может быть как 1-2 штуки, так и более 100... вот и хочется чтобы пользователь, видел прогрессбар в модальной форме, пока основная программа обрабатывает изображения - типа: "Подождите, идет обработка файла - filenane.jpg' и заполняющийся прогресс бар...
Вот в таком случае - что лучше в поток отправить обработку изображений или модальную форму?
Добавлено спустя 1 минуту 21 секунду:MysticCoder писал(а):Делаешь просто StayOnTop форму, показываешь её - Show; вешаешь на таймер какую нить функцию обновления прогрессбара, а в самих вычислениях периодически вызываешь Application.ProcessMessages. И все, никаких потоков не надо.
Если так хочется поток, то сами вычисления в поток кидай лучше
Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
Re: Progressbar
Добавлено: 16.07.2016 21:55:36
pupsik
Я бы предпочёл нечто такое.
Ну и в потоке всё дело.
А так... DisableTaskWindows. Т.е. винАПИ..
Re: Progressbar
Добавлено: 16.07.2016 22:17:42
Снег Север
arriah писал(а):Тоже подумал о потоках, но с точки зрения оптимальности или может даже правильности - что будет лучше отправить в поток? Свою "долгоиграющую" процедуру? Или вызов модальной формы?
Если программе надо ждать результатов основных вычислений, то их и делать в основном потоке. А прогресбар обрабатывать в дополнительном.
Re: Progressbar
Добавлено: 16.07.2016 22:21:52
arriah
Ну вот для теста сделал примерно следующее:
Две формы Form1, Form2. На Form1 кнопка Button1
в uses подключаем unit2
Код: Выделить всё
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;
В обработчике Button1Click:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
FirstThread:NewThread;
begin
FirstThread:=NewThread.Create(false);
FirstThread.Priority:=tpNormal;;
Form2.ShowModal;
end;
Запускаем, жмем на кнопку - открывается модальная форма и заполняется прогресс бар.
Если это идеологически верно, то как мне теперь закрыть модальное окно?
Добавлено спустя 3 минуты 25 секунд:Снег Север писал(а):Если программе надо ждать результатов основных вычислений, то их и делать в основном потоке. А прогресбар обрабатывать в дополнительном
А я вот не помню где, читал, что главным правилом при работе с потоками в Lazarus является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.
То есть в моем случае обработку изображений надо вынести в отдельный поток. чтобы главный поток приложения мог взаимодействовать с компонентами формы, или я ошибаюсь?
Re: Progressbar
Добавлено: 16.07.2016 22:28:11
Снег Север
arriah писал(а): я вот не помню где, читал, что главным правилом при работе с потоками в Lazarus является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.
Это уже давно неверно. В лазаре реализован тот же class tthread, что и в делфи, там есть метод synchronize, который специально служит для безопасного взаимодействия с визуальными компонентами из потока. В статье по моей ссылке всё это расписано.
Re: Progressbar
Добавлено: 16.07.2016 22:35:42
pupsik
http://wiki.freepascal.org/Multithreaded_Application_Tutorial не достаточно?
Конкретно в вашем случае: "навесить" эвент на поток.
п.с.
Зачем модальное окно? Пользы никакой.
Re: Progressbar
Добавлено: 16.07.2016 22:41:39
arriah
А если пользователь клацнет на основную форму, то окно с прогресбаром скроется))
Re: Progressbar
Добавлено: 17.07.2016 10:20:54
MysticCoder
arriah писал(а):Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
Никто тебе не мешает передать имя файла, которое в таймере покажет прогрессбар.
Re: Progressbar
Добавлено: 17.07.2016 15:21:54
arriah
MysticCoder писал(а):arriah писал(а):Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
Никто тебе не мешает передать имя файла, которое в таймере покажет прогрессбар.
Согласен. Но я уже сделал потоками
Re: Progressbar
Добавлено: 17.07.2016 16:51:35
pupsik
А если пользователь клацнет на основную форму, то окно с прогресбаром скроется))
т.е. только в этом польза модального окна

Тогда оно не нужно вообще....
Для начала почитайте
https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BE%D0%BA%D0%BD%D0%BE.