Вызов TThread.Synchronize в основном потоке. - PullRequest
3 голосов
/ 18 марта 2020

Кража из статьи Уве Раабе Синхронизация и очередь с параметрами Я делаю это:

if GetCurrentThreadID = MainThreadID then
  FDataLogger(IntToStr(lNrItems) + ' elements:')
else
  TThread.Synchronize(nil,
          procedure
          begin
            FDataLogger(IntToStr(lNrItems) + ' elements:');
          end);

Но если я просто

  TThread.Synchronize(nil,
          procedure
          begin
            FDataLogger(IntToStr(lNrItems) + ' elements:');
          end);

, это, кажется, работает как хорошо.

Так как первая конструкция приводит к большему количеству кода, действительно ли много выгод от различения основного потока?

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

Хотя документация предупреждает вас об этом, фактический код внутри TThread.Synchronize напоминает показанный код переноса. Так что я почти уверен, что с более короткой версией можно обойтись.

Возможно, меня тоже вводила в заблуждение документация (или в древние времена такое поведение было укушено в Delphi 5 или около того) когда я написал эту статью.

1 голос
/ 18 марта 2020

Документация TThread.Synchronize четко гласит:

Предупреждение. Не вызывайте синхронизацию из основного потока. Это может вызвать бесконечность l oop.

http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TThread.Synchronize

...