Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


AxNb ©   (2012-12-20 19:50:00) 

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

Суть:

Есть форма с одним " 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;


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

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


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


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

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


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


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


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


AxNb   (2012-12-21 15:58:00) [4]


> > брат Птибурдукова   (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 на единицу....получается время отобразить данные предостаточно....или я чтото упускаю?


O'ShinW   (2012-12-21 13:06:00) [5]


> Anatoly Podgoretsky

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


Anatoly Podgoretsky   (2012-12-20 22:13:00) [6]

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

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


Dimka Maslov   (2012-12-20 22:01:00) [7]

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


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


> Application.ProcessMessages;


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


O'ShinW   (2012-12-20 21:20:00) [9]


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

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


O'ShinW   (2012-12-20 21:19:00) [10]


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


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

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо