powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с потоками
6 сообщений из 6, страница 1 из 1
Работа с потоками
    #32091868
falcon_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую Всех!
Имеется программа, которая в
какой-то момент времени выполняет долгие вычисления.
И чтобы для юзера программа не казалась зависшей решил
вывести отдельное окошко, в котором показывать процесс
ну скажем ProgressBar-ом. В итоге пришел к созданию другого
потока в котором производится визуальное отображение.
К сожалению у меня ничего не вышло. С потоками работаю впервые.
Поэтому набросал мелкий примерчик, который тоже не работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

  MyThread = class(TThread)
  private
      ig:Integer;
  protected
      procedure Execute; override;
      procedure UP;
  end;

var
  Form1 : TForm1;
  MT    : MyThread;

procedure TForm1.Button1Click(Sender: TObject);
var
   i,j,zzz : Integer;
begin
   MT:=MyThread.Create(False);
//симуляция вычислений
   for i:= 1  to  20000  do
       for j:= 1  to  5000  do
           zzz:=round(i/j);
end;

procedure MyThread.Execute;
var k : Integer;
begin
   for k:= 1  to  20000  do
     begin
        ig:=k;
        sleep( 200 );
        Synchronize(UP);
     end;
end;

procedure MyThread.UP;
begin
   Form1.Edit1.Text:=IntToStr(ig);
end;


Подскажите что не так. Вывод результата происходит после проведения
вычислений.
...
Рейтинг: 0 / 0
Работа с потоками
    #32091987
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае в потоке не знаю какой результат получится - вызвать Application.ProcessMessages в процедуре UP

И тебе лучше не потоком делать - если конечно не запрос к базе и итераций много в вычислениях, а Application.ProcessMessages вызывать прямо в ходе вычислений. Но это если есть где, конечно
...
Рейтинг: 0 / 0
Работа с потоками
    #32092029
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А обновление не помогает? А-ля form1.edit1.repaint
...
Рейтинг: 0 / 0
Работа с потоками
    #32092262
Mich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно ты как-то делаешь...
Первый поток создает второй, запускает его и уходит в вычисления. Второй каждые 200мс пытается заставить его что-то делать. Так ведь первый занят! Отработает свое, нарисует.
Насколько я понял тебе надо все вычисления перенести во второй, а первый пусть с юзером общается, кнопочки, менюшечки, ну и прогресс отображает.
...
Рейтинг: 0 / 0
Работа с потоками
    #32093072
falcon_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2tygra
Application.ProcessMessages действительно в этом примере помогает.
Но как правильно замечено в реальной программе происходит обращение к базе с выполнением долгого запроса и выполнение других операций, так что
это не совсем то что надо.

2SiDen
Ваш вариант не работает

2Mich
А как тогда быть если все вычисления и обращения к базе происходит в основном потоке программы. Для юзера происходит как бы зависание проги
и надо хоть что-то вывести. А работать юзеру с меню, кнопками и т.д.
в процессе вычислений нет необходимости и ненадо это ему. Этот пример халявный только для отработки технологии.

2All
Может кто подскажет как производить вывод информации о процессе
выполнения проги, если процесс долгий и не предсказуемый по времени.
...
Рейтинг: 0 / 0
Работа с потоками
    #32094986
falcon_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2All

После некоторых экспериментов пришел к такому результату.
Прошу высказаться по этому поводу.
Как ни странно - работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  end;

  MyThread = class(TThread)
  private
      ig:Integer;
  protected
      procedure Execute; override;
      procedure UP;
  end;

var
  Form1 : TForm1;
  MT    : MyThread;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Form1.Button1.Enabled:=False;
   ProgressBar1.Position:= 0 ;
   ProgressBar1.Max:= 1000 ;
   ProgressBar1.Step:= 1 ;
   MT:=MyThread.Create(False);
   repeat
       Application.ProcessMessages;
       ProgressBar1.Position:=ProgressBar1.Position+ProgressBar1.Step;
       if ProgressBar1.Position=ProgressBar1.Max then
          ProgressBar1.Position:=ProgressBar1.Min;
       Sleep( 5 );
   until MT.Terminated;
   ProgressBar1.Position:=ProgressBar1.Max;
   ShowMessage('Конец процессу!');
   Application.Terminate;
end;

procedure MyThread.Execute;
var i:Integer;
begin
   for i:= 1  to  100  do
       begin
          ig:=i;
          Synchronize(UP);
          sleep( 100 );
       end;
   MT.Terminate;
end;

procedure MyThread.UP;
begin
   Form1.Edit1.Text:=IntToStr(ig);
end;
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с потоками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]