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

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

Как выводить статус от нескольких потоков? [D5]


Страницы:   1 2 3

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


Страницы:   1 2 3

Наверх

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