Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.01.2014, 11:33
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию progressbar в поток

Приветствую.

Впервые использую потоки. Возникла необходимость показывать движущийся прогресс бар при долгих действиях (н\п призагрузке файла).

Бар в отдельной форме. Почему-то не работает(

Код:
............
  TMyThread = class(TThread)
  private

  protected
    procedure Execute; override;
    procedure Update;
  end;

var
  Form1: TForm1;
  MyThread: TMyThread;

implementation
.........

Код:
procedure TMyThread.Update;
begin
  Form3.ProgressBar1.StepIt;
end;

Код:
procedure tMyThread.Execute;
begin
  while not Terminated do
  begin
    Synchronize(Update);
    sleep(1000);
  end;
end;

Код:
  ........
  if (not Assigned(form3)) then form3:=tform3.Create(form3);
  form3.Show;
  MyThread:=TMyThread.Create(true);

  // долгие операции

  MyThread.Terminate;
  form3.close;
  .........
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #2  
Старый 24.01.2014, 11:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

потому что когда в основном потоке выполняется строка
Код:
// долгие операции
метод Synchronize в потоке будет ждать ее завершения
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 24.01.2014, 12:05
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

и как быть тогда?

мне нужно простейшее анимирование при каких-либо действиях

проще говоря, полный аналог
Код:
screen.cursor:=crHourGlass;
...
screen.cursor:=crdefault;
но только с прогресс баром
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #4  
Старый 24.01.2014, 12:14
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

строку
Код:
// долгие операции
перенести в поток
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 24.01.2014, 12:32
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

но тогда это не будет являться универсальной процедурой, которую можно воткнуть в любое место программы

может есть другие способы визуализировать долгие процессы? (кроме screen.cursor)
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #6  
Старый 24.01.2014, 12:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
Application.ProcessMessages;
без потоков
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 24.01.2014, 12:58
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

это бессмысленно, например, в
Код:
ADOQuery_Slut.Insert;
  TBLOBField(ADOQuery_Slut.FieldByName('file')).LoadFromFile(path);
ADOQuery_Slut.Post;

прога как бы виснет и все...
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #8  
Старый 24.01.2014, 14:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Mrak
...прога как бы виснет и все...
А что мешает через отдельный таймер, он тоже на потоках, в смысле, не зависнет
Ответить с цитированием
  #9  
Старый 24.01.2014, 14:37
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Alegun
А что мешает через отдельный таймер, он тоже на потоках, в смысле, не зависнет
Окно-то не отрисуется.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #10  
Старый 24.01.2014, 16:05
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Mrak
это бессмысленно, например, в
Код:
ADOQuery_Slut.Insert;
  TBLOBField(ADOQuery_Slut.FieldByName('file')).LoadFromFile(path);
ADOQuery_Slut.Post;

прога как бы виснет и все...
Такое нужно однозначно делать в отдельном потоке чтобы главный поток не зависал. Ведь по-любому один из потоков должен выполнить эту неуправляемо-длительную операцию и понятно, что если это будет делать основной поток, то приложение на это время будет переставать реагировать, так как в VCL взаимодействием с пользователем именно главный поток и занимается.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Mrak (27.01.2014)
  #11  
Старый 24.01.2014, 16:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Mrak
но тогда это не будет являться универсальной процедурой, которую можно воткнуть в любое место программы
а это и не надо
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Mrak (27.01.2014)
  #12  
Старый 27.01.2014, 09:10
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

спасибо, специфику потоков понял
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter