2011-12-28 7 views
1

Мне нужно работать с устаревшим кодом. Этот код имеет TTimer, созданный в основном потоке. В событии OnTimer таймер периодически проверяет состояние некоторых данных в рабочем потоке.Создает ли TTimer.OnTimer рабочий поток для синхронизации с основным потоком?

псевдокод:

procedure MainForm.OnTimer(Sender: TObject); 
begin 
    if WorkerThread.Data.State = full then 
    begin 
    WorkerThread.Free; //This freezes GUI.  
    end else 
    //Do something else. 
end; 

Проблема заключается в том, что я хочу сделать некоторые базовые операции, когда WorkerThread прекращает. Чтобы избежать синхронизации, я преодолел метод DoTerminate. Однако в этом конкретном случае это не помогает, и мой графический интерфейс становится замороженным до тех пор, пока не закончится DoTerminate.

Могу ли я как-то избежать заморозки?

Спасибо.

+0

Так что вы делаете в DoTerminate? –

+0

Некоторые базы данных. Я не синхронизирую с графическим интерфейсом. – Wodzu

+1

Здесь недостаточно кода. Вызов Free на поток вызывает Terminate, а затем WaitFor. Поможет ли это замораживание? –

ответ

3

Здесь недостаточно кода, чтобы сказать что-либо с уверенностью. Тем не менее, при вызове Free в потоке получается звонок Terminate, за которым следует WaitFor. Весьма правдоподобно, что ожидание не возвращается, что согласуется с замороженным интерфейсом.

0

Это действительно назад. В любой подходящей схеме нитей ваш поток будет уведомлять вашу gui-нить о состоянии типа .Data.State = full. После этого вы будете выполнять действия gui-thread или main-thread. Одно я уверен, что WorkerThread.Free должен быть неправильным. Попытка освободить поток, который, по-видимому, заблокирован по какой-либо причине, гарантированно провалится. Thread.Terminate также будет терпеть неудачу, если поток заблокирован, поэтому никакой помощи нет.

Имея монитор таймера, состояние нити никогда не будет правильным. Я никогда не употребляю слова всегда и никогда, но ... Повторюсь: наличие монитора Timer, состояние нити никогда не будет правильным. Никогда. Даже не думай об этом.

  • Turin
+0

Я не согласен, по крайней мере частично. Для проверки статуса таймер является хорошим средством с низким приоритетом и позволяет потоку работать с бизнесом независимо от того, что делает основной поток. Но я согласен, что это плохое использование здесь, поскольку это не просто отображение статуса, но и активное управление. – mj2008

+0

@ Турин Я согласен, что почти никогда не бывает прав. Но, как я писал ранее, это устаревший код, и таймер был там с самого начала. – Wodzu

Смежные вопросы