Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

зависает поток   Найти похожие ветки 

 
Quest   (2004-08-18 00:32) [0]

Здраствуйте.
У меня такая проблема - после нескольких вызовов Synchronize(change) программа зависает. Что я неправильно делаю?

type
 TFileThread=class(TThread)
  private
   text: string;
   item: TListItem;
  protected
   procedure change;
   procedure additem;
   procedure execute; override;
  end;

...

procedure TFileThread.additem;
begin
item := Form1.ListView1.Items.Add;
end;

procedure TFileThread.change;
begin
item.Caption := text;
end;

procedure TFileThread.execute;
begin
...
Synchronize(AddItem);
while true do
 begin
  ...
  synchronize(change); // проблема
  ...
 end;
...
end;

Заранее спасибо


 
Ihor Osov'yak ©   (2004-08-18 03:19) [1]

код, приведенный Вами, недостаточный, чтобы понять в чем проблема. Вероятнее всего где-то возникает клинч основного и рабочего потока.
Как подсказка - для успешного срабатывания synchronize нужно, чтобы на момет вызова синхронайз цыкл выборки основного потока не был заторможен (так как передача управления подсинхроназнутой процедуре идет с использованием цыкла выборки сообщений основного потока). Если же Вы после старта рабочего потока в основном используете что то вида sleep и/или WaitForSingleObject - все может быть.. Вообще-то сделайте вывод в отладочный текстовый лог котнольных точек основного потока и рабочего (но не забудьте про критические секции, так как функция записи в лог будет вызываться и из основного потока, и из рабочего, и возможно, "в один и тот же момент времени". Трассировкой в пошаговом режиме проблему не всегда можно локализировать, так как при пошаговом выполнение временное соотношение событий основного потока и рабочего очень отличаются от соотношений нормального выполнения..

Также пожно попытаться при "зависании" сделать паузу программы и по CtrlAltC все же посмотреть, где и на чем висим, в каком состоянии находятся потоки программы.

Зы. Проще ошибок этого класса избегать, чем потом ловить.  Один из вариантов этого избегания - изначально продумывать вопрос синхронизации потоков программы, и по возможности избегать использования синхронайз ввиду его недостаточной гибкости и излишней в большинстве случаев синхронизации рабочего и основного потоков - я, к примеру, синхронайз вообще никогда не использую. Мало того, я придерживаюсь мнения - что синхронайз - далеко не самое удачное решения Борланда. Ибо начинающие не совсем понимают механизма его действия и постоянно наступают на грабли с ним. А после разборки  со способами синхронизации и взаимодействия потоков (в том числе и с решением "синхронайз" от Борланда) совсем исчезает необходимость использовать синхронайз. Правда, незадача - наличие борландовского синхронайз очень уж не способствует приближения момента вышеупомянутой разборки.



Страницы: 1 вся ветка

Текущий архив: 2004.09.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.038 c
14-1092397485
nasty
2004-08-13 15:44
2004.09.05
люди добрые! есть ли в процессорах амд технология ммх?


3-1092068498
PFR
2004-08-09 20:21
2004.09.05
BDE блокирует каталог с таблицами даже если закрыты все таблицы


6-1088617297
leonidus
2004-06-30 21:41
2004.09.05
Тунель через прокси


1-1092730717
ceval
2004-08-17 12:18
2004.09.05
как в Excel сделать заголовок столбца (по середине) и


1-1093010645
Gear
2004-08-20 18:04
2004.09.05
опять поток!