Progressbar

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Progressbar

Сообщение arriah » 16.07.2016 11:20:21

Хочу на отдельной форме, желательно в модальной запустить прогрессбар, пока остновная софтина занята вычислениями.

Подскажите пример, если можно..что-то я завис..
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Progressbar

Сообщение Снег Север » 16.07.2016 16:08:31

Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Progressbar

Сообщение arriah » 16.07.2016 21:45:52

Снег Север писал(а):Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html

Тоже подумал о потоках, но с точки зрения оптимальности или может даже правильности - что будет лучше отправить в поток? Свою "долгоиграющую" процедуру? Или вызов модальной формы?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Progressbar

Сообщение MysticCoder » 16.07.2016 21:52:06

Делаешь просто StayOnTop форму, показываешь её - Show; вешаешь на таймер какую нить функцию обновления прогрессбара, а в самих вычислениях периодически вызываешь Application.ProcessMessages. И все, никаких потоков не надо.

Если так хочется поток, то сами вычисления в поток кидай лучше
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Progressbar

Сообщение pupsik » 16.07.2016 22:12:54

arriah всё от задачи.
1- Имитация прогресса. И пока функция не закончит работу... имитировать бурную деятельность.
2. Запихнуть работу в поток и выводить "тихим" прогрессом. Т.е. без всяких диалогов. Зафризив необходимое.
3. ВинАПИ в подмогу. С его помощью можно сделать многое. В т.ч. и диалоог с прогрессом.
п.с.
но с точки зрения оптимальности или может даже правильности
у каждого она разная. Кода то нет....
StayOnTop
- не надо это "трогать". Больше вопросов будет.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Progressbar

Сообщение arriah » 16.07.2016 22:22:54

pupsik писал(а):arriah всё от задачи.

На данные момент работает так:

Программа получает массу ссылок на изображения, обрабатывает их, и заливает по фтп на другой сервер.. Изображений может быть как 1-2 штуки, так и более 100... вот и хочется чтобы пользователь, видел прогрессбар в модальной форме, пока основная программа обрабатывает изображения - типа: "Подождите, идет обработка файла - filenane.jpg' и заполняющийся прогресс бар...

Вот в таком случае - что лучше в поток отправить обработку изображений или модальную форму?

Добавлено спустя 1 минуту 21 секунду:
MysticCoder писал(а):Делаешь просто StayOnTop форму, показываешь её - Show; вешаешь на таймер какую нить функцию обновления прогрессбара, а в самих вычислениях периодически вызываешь Application.ProcessMessages. И все, никаких потоков не надо.

Если так хочется поток, то сами вычисления в поток кидай лучше

Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Progressbar

Сообщение pupsik » 16.07.2016 22:55:36

Я бы предпочёл нечто такое.
Ну и в потоке всё дело.
А так... DisableTaskWindows. Т.е. винАПИ..
Вложения
showprogress.7z
(59.04 КБ) Скачиваний: 572
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Progressbar

Сообщение Снег Север » 16.07.2016 23:17:42

arriah писал(а):
Снег Север писал(а):Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html

Тоже подумал о потоках, но с точки зрения оптимальности или может даже правильности - что будет лучше отправить в поток? Свою "долгоиграющую" процедуру? Или вызов модальной формы?

Если программе надо ждать результатов основных вычислений, то их и делать в основном потоке. А прогресбар обрабатывать в дополнительном.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Progressbar

Сообщение arriah » 16.07.2016 23:18:27

Ну вот для теста сделал примерно следующее:

Две формы 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 является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.

То есть в моем случае обработку изображений надо вынести в отдельный поток. чтобы главный поток приложения мог взаимодействовать с компонентами формы, или я ошибаюсь?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Progressbar

Сообщение Снег Север » 16.07.2016 23:28:11

arriah писал(а): я вот не помню где, читал, что главным правилом при работе с потоками в Lazarus является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.

Это уже давно неверно. В лазаре реализован тот же class tthread, что и в делфи, там есть метод synchronize, который специально служит для безопасного взаимодействия с визуальными компонентами из потока. В статье по моей ссылке всё это расписано.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Progressbar

Сообщение pupsik » 16.07.2016 23:35:42

http://wiki.freepascal.org/Multithreaded_Application_Tutorial не достаточно?
Конкретно в вашем случае: "навесить" эвент на поток.

п.с.
Зачем модальное окно? Пользы никакой.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Progressbar

Сообщение arriah » 16.07.2016 23:41:39

pupsik писал(а):http://wiki.freepascal.org/Multithreaded_Application_Tutorial не достаточно?
Конкретно в вашем случае: "навесить" эвент на поток.

п.с.
Зачем модальное окно? Пользы никакой.

А если пользователь клацнет на основную форму, то окно с прогресбаром скроется))
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Progressbar

Сообщение MysticCoder » 17.07.2016 11:20:54

arriah писал(а):Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть


Никто тебе не мешает передать имя файла, которое в таймере покажет прогрессбар.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Progressbar

Сообщение arriah » 17.07.2016 16:21:54

MysticCoder писал(а):
arriah писал(а):Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть


Никто тебе не мешает передать имя файла, которое в таймере покажет прогрессбар.

Согласен. Но я уже сделал потоками
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Progressbar

Сообщение pupsik » 17.07.2016 17:51:35

А если пользователь клацнет на основную форму, то окно с прогресбаром скроется))
т.е. только в этом польза модального окна :mrgreen: Тогда оно не нужно вообще....
Для начала почитайте 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.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru