Форум: "Основная";
Текущий архив: 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