2013-07-25 2 views
1

Я читал этот пост, что практически решить мою проблему, так как никто не отвечал на мои комментарии, я решил сделать вопрос:TThread с общим OnTerminate поведения

Original Post that almost answer my question

Как я спросил там:

  • Поскольку возможно многопоточное разделение одного и того же OnTerminate Событие, возможно также, что они заканчиваются в одно и то же время?
  • Если да, что происходит? Вызов метода OnTerminate будет «выставлен в очередь» O.S? Другими словами, будет ли код свободен от повторного размещения, если использует свойства MainThread?

ответ

4

Можно Многопоточность одни и те же OnTerminate Event

Да, так же, как ответ на the other question показал вам.

и закончить в то же время?

Потоки могут завершать работу одновременно, но по умолчанию обработчики событий OnTerminate не будут вызываться одновременно. Это связано с тем, что обработчик события OnTerminate запускается по TThread, используя внутренний вызов TThread.Synchronize(), поэтому несколько потоков, инициирующих их события OnTerminate, одновременно не перекрывают друг друга. Чтобы изменить это поведение (которое большинство людей не делает), вам придется переопределить виртуальный метод TThread.DoTerminate(), чтобы вручную вызвать обработчик событий OnTerminate напрямую, не вызывая сначала TThread.Synchronize().

+0

Нет, нет Я не буду переопределять, это нормально – EProgrammerNotFound

+0

@MartinJames Я соглашусь на ответ Реми, потому что он ответил первым и объяснил поведение 'synchronize', хорошо? ваш ответ был очень ясным и полезным. Спасибо, ребята, за предоставленную помощь, спасибо @Martin за подсказку «Application.ProcessMessages» – EProgrammerNotFound

3

OnTerminate - это событие, выпущенное в потоке VCL, поэтому оно должно быть отправлено или, скорее, SendMessaged. В любом случае, OnTerminates будут сериализованы.

Тем не менее, я никогда не использовал это событие с D3 (когда я узнал, какая часть поддержки потока Delphi фактически «работает»).

Редактировать - вы можете получить свои призывы OnTerminate для повторного входа, вызвав Application.ProcessMessages внутри него (если вы чувствуете себя особенно самоубийственно :).

+0

Прослушивается ли это событие? – EProgrammerNotFound

+1

В delphi 6, как сказал @Remy, он использует syncrhonize вместо SendMessage – EProgrammerNotFound

+0

'вы можете получить вызовы OnTerminate для повторного входа, вызвав Application.ProcessMessages' Truth [+1]. – EProgrammerNotFound

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