Идея в следующем: часто бывает нужен "Synchronize с параметрами", т.е. из потока надо вызвать некий метод, передать ему параметры, дождаться, пока метод отработает в основном потоке, получить результат и продолжить работу. На native Delphi приходится где-то запоминать параметры, вызывать Synchronize(Method), а Method, в свою очередь, вызовет требуемое, вынув параметры из этого "где-то". Я попытался упростить код. Получилось красиво даже на Delphi, но без поддержки компиллятора приходится соблюдать ограничения, несовместимые с удобством.
Как выглядит:
класс TThread получил метод Fork: boolean, который надо вызвать в требующем синхронизации методе:
TMyThread.MainThreadMethod(ParamList): AnyType;
begin
if Fork then exit;
.....
end;
Fork проверяет, в каком потоке он выполняется, и возвращает false, если это MainThread. В противном случае fork выполняет переключение в MainThread, копирует параметры из стека потока в стек MainThread и повторно вызывает этот же метод. Затем возвращает true.
Вызов получается абсолютно корректным как с точки зрения reference count, так и с точки зрения обработки exceptions. Всё, чего не хватает при реализации на Delphi: метод не должен быть register (все параметры нужны в стеке) и, находясь в Fork, невозможно определить точку входа в обрамляющий метод - приходится передавать её как параметр:
if Fork(@TMyThread.MainThreadMethod) then exit;
Компилятору это, естественно, не проблема. B)