![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выводить статус от нескольких потоков? [D5]
MegaVolt © (2006-03-02 16:29:00)Есть несколько потоков выполняющих какую то работу. У каждого потока есть некоторые состояния описывающие то что он делает в конкретный момент времени. Например строка. Как сделать вывод в главной форме этих данных чтобы форма не тормозила из-за того что при синхронизации все опреции происходят через главный поток?
Гаврила (2006-03-02 17:31:00) [41]
> MegaVolt ©
При работе с TThreadList ты попадаешь под критические секции самого листа. ТО есть пока один поток там что-то делает, остальные ждут.
Я аналогичную задачу выполняю так - отправляю пост-мессаджи на хендл формы, без секций
MegaVolt (2006-03-02 17:21:00) [42]Возможно при такой организации Synchronize не нужен? Т.е. в любом потоке я обращаюсь к TThreadList и всё будет работать так как нужно?
MegaVolt (2006-03-02 17:13:00) [43]Хм... Заремил всё а тормоза остались :( Видать много потоков как то всё же тормозят сами по себе.
MegaVolt (2006-03-02 16:58:00) [44]Записываю в потоке сообщение так:
FLogs:String;
property Logs:String write SaveLog;
procedure SaveLog(const Value: String);
procedure SaveLogs;
procedure TScanIP.SaveLog(const Value: String);
begin
FLogs:=Value;
Synchronize(SaveLogs);
end;
procedure TScanIP.SaveLogs;
var
i:integer;
begin
with Form1.ListThead.LockList do
try
for i:=Count-1 downto 0 do
if (PTheadItem(Items[i])^.IP)=IP
then
begin
PTheadItem(Items[i])^.Log:=FLogs;
break;
end;
finally
Form1.ListThead.UnlockList;
end;
end;
вычитываю так:
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
with ListThead.LockList do
try
if Item.Index<Count
then
begin
Item.Caption:=IPToStr(PTheadItem(Items[Item.Index])^.IP);
Item.SubItems.Add(SecToFTime(Round((GetTickCount-PTheadItem(Items[Item.Index])^.Start)/1000)));
Item.SubItems.Add(PTheadItem(Items[Item.Index])^.Log);
end
else
begin
Item.Caption:='';
Item.SubItems.Add('');
Item.SubItems.Add('');
end;
finally
ListThead.UnlockList;
end;
end;
Сергей М. (2006-03-02 16:49:00) [45]Код приводи
MegaVolt (2006-03-02 16:46:00) [46]Я не совсем Synchronize использую. Я использовал TThreadList для обмена. Но получил то что форма при перетаскивании уже ощутимо дергается :(
Сергей М. (2006-03-02 16:42:00) [47]синхронизировать только те операции, которые обновляют виз.контролы на целевой форме.
DesWind (2006-03-02 16:37:00) [48]через сообщения или по таймеру на форме обновлять инфу о потоках
Crash Coredump (2006-03-02 16:30:00) [49]Не наблюдал тормозов при использовании Synchronize