Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2018.02.18;
Скачать: [xml.tar.bz2];

Вниз

Динамические потоки не обновляют вовремя визуальные данные - 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.001 c
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


2-1456480306
Dmk
2016-02-26 12:51
2018.02.18
punpcklbw (MMX)


2-1455289799
Дмитрий
2016-02-12 18:09
2018.02.18
как изменить общее свойство разнотипных контролов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский