Progressbar
Модератор: Модераторы
Progressbar
Хочу на отдельной форме, желательно в модальной запустить прогрессбар, пока остновная софтина занята вычислениями.
Подскажите пример, если можно..что-то я завис..
Подскажите пример, если можно..что-то я завис..
- Снег Север
- долгожитель
- Сообщения: 3069
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html
http://www.realcoding.net/articles/poto ... elphi.html
Снег Север писал(а):Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html
Тоже подумал о потоках, но с точки зрения оптимальности или может даже правильности - что будет лучше отправить в поток? Свою "долгоиграющую" процедуру? Или вызов модальной формы?
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
Делаешь просто StayOnTop форму, показываешь её - Show; вешаешь на таймер какую нить функцию обновления прогрессбара, а в самих вычислениях периодически вызываешь Application.ProcessMessages. И все, никаких потоков не надо.
Если так хочется поток, то сами вычисления в поток кидай лучше
Если так хочется поток, то сами вычисления в поток кидай лучше
arriah всё от задачи.
1- Имитация прогресса. И пока функция не закончит работу... имитировать бурную деятельность.
2. Запихнуть работу в поток и выводить "тихим" прогрессом. Т.е. без всяких диалогов. Зафризив необходимое.
3. ВинАПИ в подмогу. С его помощью можно сделать многое. В т.ч. и диалоог с прогрессом.
п.с.
1- Имитация прогресса. И пока функция не закончит работу... имитировать бурную деятельность.
2. Запихнуть работу в поток и выводить "тихим" прогрессом. Т.е. без всяких диалогов. Зафризив необходимое.
3. ВинАПИ в подмогу. С его помощью можно сделать многое. В т.ч. и диалоог с прогрессом.
п.с.
у каждого она разная. Кода то нет....но с точки зрения оптимальности или может даже правильности
- не надо это "трогать". Больше вопросов будет.StayOnTop
pupsik писал(а):arriah всё от задачи.
На данные момент работает так:
Программа получает массу ссылок на изображения, обрабатывает их, и заливает по фтп на другой сервер.. Изображений может быть как 1-2 штуки, так и более 100... вот и хочется чтобы пользователь, видел прогрессбар в модальной форме, пока основная программа обрабатывает изображения - типа: "Подождите, идет обработка файла - filenane.jpg' и заполняющийся прогресс бар...
Вот в таком случае - что лучше в поток отправить обработку изображений или модальную форму?
Добавлено спустя 1 минуту 21 секунду:
MysticCoder писал(а):Делаешь просто StayOnTop форму, показываешь её - Show; вешаешь на таймер какую нить функцию обновления прогрессбара, а в самих вычислениях периодически вызываешь Application.ProcessMessages. И все, никаких потоков не надо.
Если так хочется поток, то сами вычисления в поток кидай лучше
Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
Я бы предпочёл нечто такое.
Ну и в потоке всё дело.
А так... DisableTaskWindows. Т.е. винАПИ..
Ну и в потоке всё дело.
А так... DisableTaskWindows. Т.е. винАПИ..
- Вложения
-
- showprogress.7z
- (59.04 КБ) 790 скачиваний
- Снег Север
- долгожитель
- Сообщения: 3069
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
arriah писал(а):Снег Север писал(а):Используйте потоки. Вот пример на делфи, в лазарус всё аналогично:
http://www.realcoding.net/articles/poto ... elphi.html
Тоже подумал о потоках, но с точки зрения оптимальности или может даже правильности - что будет лучше отправить в поток? Свою "долгоиграющую" процедуру? Или вызов модальной формы?
Если программе надо ждать результатов основных вычислений, то их и делать в основном потоке. А прогресбар обрабатывать в дополнительном.
Ну вот для теста сделал примерно следующее:
Две формы Form1, Form2. На Form1 кнопка Button1
в uses подключаем unit2
//тут основная процедура потока
В обработчике Button1Click:
Запускаем, жмем на кнопку - открывается модальная форма и заполняется прогресс бар.
Если это идеологически верно, то как мне теперь закрыть модальное окно?
Добавлено спустя 3 минуты 25 секунд:
А я вот не помню где, читал, что главным правилом при работе с потоками в Lazarus является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.
То есть в моем случае обработку изображений надо вынести в отдельный поток. чтобы главный поток приложения мог взаимодействовать с компонентами формы, или я ошибаюсь?
Две формы 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 является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.
То есть в моем случае обработку изображений надо вынести в отдельный поток. чтобы главный поток приложения мог взаимодействовать с компонентами формы, или я ошибаюсь?
- Снег Север
- долгожитель
- Сообщения: 3069
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
arriah писал(а): я вот не помню где, читал, что главным правилом при работе с потоками в Lazarus является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.
Это уже давно неверно. В лазаре реализован тот же class tthread, что и в делфи, там есть метод synchronize, который специально служит для безопасного взаимодействия с визуальными компонентами из потока. В статье по моей ссылке всё это расписано.
http://wiki.freepascal.org/Multithreaded_Application_Tutorial не достаточно?
Конкретно в вашем случае: "навесить" эвент на поток.
п.с.
Зачем модальное окно? Пользы никакой.
Конкретно в вашем случае: "навесить" эвент на поток.
п.с.
Зачем модальное окно? Пользы никакой.
pupsik писал(а):http://wiki.freepascal.org/Multithreaded_Application_Tutorial не достаточно?
Конкретно в вашем случае: "навесить" эвент на поток.
п.с.
Зачем модальное окно? Пользы никакой.
А если пользователь клацнет на основную форму, то окно с прогресбаром скроется))
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
arriah писал(а):Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
Никто тебе не мешает передать имя файла, которое в таймере покажет прогрессбар.
MysticCoder писал(а):arriah писал(а):Нее, я так пробовал. В таком случае прогрессбар не отражает реальное положение дел - мне надо чтобы видно ыбло какой файл обрабатывается.. то есть получается в реальном времени доступ к компонентам из потока должен быть
Никто тебе не мешает передать имя файла, которое в таймере покажет прогрессбар.
Согласен. Но я уже сделал потоками
т.е. только в этом польза модального окнаА если пользователь клацнет на основную форму, то окно с прогресбаром скроется))
Для начала почитайте 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.
