Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.02.18;
Скачать: CL | DM;

Вниз

Динамические потоки не обновляют вовремя визуальные данные - XE2   Найти похожие ветки 

 
AxNb ©   (2012-12-20 19:50) [0]

Добрый день, пишу первый раз на форуме, не судите строго.

Суть:

Есть форма с одним " Label " - Label_Info и с одним Memo1.
Есть Array для "хранения" потоков.

Задача проста:
По нажатию на кнопке процедура "CreateThreads" создает 10 потоков.
Каждый из них - увеличивает глобальную переменную "CurIndex" на единицу ( inc(CurIndex) ), потом задерживается на (2000* CurIndex) секунд  и отображает результат в " Label_Info " и в Memo1.

Вроде все просто до невозможности но....!!!!

Проблема:
В Memo1 все отображается на ура - 1 потом 2 потом 3....до 9

А вот Label_Info сразу становится = 10 - то есть нету задержки и нету постепенного отображения 1 потом 2 потом 3....до 9.

Как так???

#############################################



type

TSearchThread = class(TThread)
 private
 procedure ShowInfo;

 protected
 procedure Execute; override;

 public
 procedure NextIndex;
 end;

....................................

var

CurIndex   : Integer;
ThAr: array [0..10] of TSearchThread;

....................................

implementation

{$R *.dfm}

procedure TSearchThread.NextIndex;
begin
 CurIndex  :=  CurIndex+1;
//  THIndex := CurIndex;
end;

procedure TSearchThread.ShowInfo;
begin
Form1.Label1.Caption := IntToStr(CurIndex);
Form1.Memo1.Lines[0]:=(IntToStr(THIndex));
end;

procedure TSearchThread.Execute;
var i:Integer;
begin
Inc(CurIndex);
Application.ProcessMessages;
Sleep(2000*CurIndex);
Synchronize(ShowInfo);
end;

................

procedure TForm1.CreateThreads;
var k: Integer;
begin
for k :=0 to 9 do
begin
  ThAr[k]:=TSearchThread.Create(true);
  ThAr[k].FreeOnTerminate := true;
  ThAr[k].THIndex := k;
  ThAr[k].Resume;  //Start
end;


end;



 
Медвежонок Пятачок ©   (2012-12-20 19:58) [1]

А вот Label_Info сразу становится = 10 - то есть нету задержки и нету постепенного отображения 1 потом 2 потом 3....до 9.

Ты просто не успеваешь это заметить


 
брат Птибурдукова   (2012-12-20 21:18) [2]

Гы. Найди отличие:
IntToStr(CurIndex);
IntToStr(THIndex)


 
O'ShinW ©   (2012-12-20 21:19) [3]


> procedure TSearchThread.ShowInfo;
> begin
> Form1.Label1.Caption := IntToStr(CurIndex);
sleep(100);
> Form1.Memo1.Lines[0]:=(IntToStr(THIndex));
> end;


 
O'ShinW ©   (2012-12-20 21:20) [4]


> брат Птибурдукова   (20.12.12 21:18) [2]
>
> Гы. Найди отличие:
> IntToStr(CurIndex);
> IntToStr(THIndex)

попался? :)
это номер потока


 
Игорь Шевченко ©   (2012-12-20 21:59) [5]


> Application.ProcessMessages;


это надо убрать


 
Dimka Maslov ©   (2012-12-20 22:01) [6]

Зачем в теле потока Application.ProcessMessages?
Для такой синхронизации лучше использовать SendMessage


 
Anatoly Podgoretsky ©   (2012-12-20 22:13) [7]

> O"ShinW  (20.12.2012 21:20:04)  [4]

THIndex вообще не объявлен


 
O'ShinW ©   (2012-12-21 13:06) [8]


> Anatoly Podgoretsky

значит, обманывают :)


 
AxNb ©   (2012-12-21 15:58) [9]


> > брат Птибурдукова   (20.12.12 21:18) [2]
> >
> > Гы. Найди отличие:
> > IntToStr(CurIndex);
> > IntToStr(THIndex)
>
> попался? :)
> это номер потока


с THIndex вышла непонятка, он вообще не нужен там нигде. Спасибо за замечание... вместо него должен быть тот же CurIndex...то есть так:

procedure TSearchThread.ShowInfo;
begin
Form1.Label1.Caption :=  IntToStr(CurIndex);
Form1.Memo1.Lines[0]:= IntToStr(CurIndex);
end;

Но почемуто так все равно все отображается только по завершению работы всех 10-ти потоков.

Как заметил " Медвежонок Пятачок " - я не успеваю это заметить...но в том и задача...каждый созданный поток "ждет" sleep (2000*CurIndex) секунд, предварительно увеличив CurIndex на единицу....получается время отобразить данные предостаточно....или я чтото упускаю?


 
AxNb ©   (2012-12-21 16:00) [10]


> > Application.ProcessMessages;
>
>
> это надо убрать


Действительно Игорь, в потоке это совсем не нужно, это же не главная форма !!!


 
брат Птибурдукова   (2012-12-21 16:08) [11]


> AxNb ©   (21.12.12 15:58) [9]
Да сначала твой десяток потоков увеличивает глобальную переменную на единицу, а потом после паузы каждый поток начинает получившуюся девятку выводить...

Мастера, а запись в глобальную переменную синхронизировать не надо? Не получим ли мы раз этак в полгода конечной суммой не 9, а 8, а раз в тысячелетие и вовсе 7?


 
AxNb ©   (2012-12-21 16:18) [12]

Да! Решил вопрос, с помощью введения еще одной глобальной переменной.
Нужно все таки иметь 2 переменные  - одна для увеличения ожидания для каждого нового потока, а другая для вывода данных.



Страницы: 1 вся ветка

Текущий архив: 2018.02.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.005 c
15-1470643886
DayGaykin
2016-08-08 11:11
2018.02.18
Изменить модель работы с базами данных в Delphi


2-1456269323
aturasama
2016-02-24 02:15
2018.02.18
idHTTPserver


2-1456414598
gedevan
2016-02-25 18:36
2018.02.18
Как создать класс Таблица?


2-1456234119
Vega
2016-02-23 16:28
2018.02.18
Проблемы с WM_SETTEXT


1-1356018654
AxNb
2012-12-20 19:50
2018.02.18
Динамические потоки не обновляют вовремя визуальные данные - XE2