Вопрос по multithreading – Опасно ли использовать синхронизацию в приложении без VCL?
Если Delphi-код был написан с помощью synchronize для сериализации доступа к основному потоку VCL, но этот код затем используется в приложении без VCL, будет ли он синхронизироваться с основным потоком приложения или просто не будет иметь никакого эффекта?
Пример:
procedure TMyThread.Execute;
begin
// ... other code
Synchronize(SomeMethod);
// ...
end;
Давайте предположим
it is a non-VCL application which has a main thread which executes in an endless loop (or until terminated) the main thread does not callCheckSynchronize
directly or in a WakeMainThread handler
a secondary thread runs and executes Synchronize(SomeMethod) like in the example above
Будет ли поток зависать в строке Synchronize (SomeMethod)?
synchronize(CallEventHandler)
в библиотеке, где я могу назначить метод для обработчика событий. Компилятор не будет жаловаться, если это приложение не VCL.
Synchronize
.
Synchronize
, Вы можете использовать все, что вы хотите. Вам просто нужно сообщить о том, что вы используете его, чтобы потребитель вашей библиотеки знал, как его использовать.CheckSynchronize
, Я не знаю, что произойдет, если хост не выполнит свою часть контракта. Не стесняйтесь написать тестовую программу и сообщить свои результаты здесь.
ми приложениями, я бы не советовал использоватьSynchronize()
вообще, так как ваша нить не имеет понятия о том, что происходит вне ее. Лучше выбрать поток, представляющий событие обратного вызова, которое поток может вызвать в своем собственном контексте, когда это необходимо, а затем позволить приложению предоставить обработчик функции обратного вызова, который при необходимости решит, как лучше синхронизироваться с основным потоком приложения. ,
Да, это опасно. Если ваш основной поток не звонитCheckSynchronize
затемSynchronize
приведет к тупику.
Let's assume
it is a non-VCL application which has a main thread which executes in an endless loop (or until terminated) the main thread does not callCheckSynchronize
directly or in a WakeMainThread
handler
a secondary thread runs and executes Synchronize(SomeMethod)
like in the example above
Will the thread hang on the Synchronize(SomeMethod)
line?
Призыв кSynchronize
будет блокировать фоновый поток, пока основной поток не вызоветCheckSynchronize
, Итак, если основной поток никогда не вызываетCheckSynchronize
фоновый поток будет блокироваться на неопределенный срок.
Следующая программа иллюстрирует это:
program TheBigSleep;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, Windows;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TMyThread.Execute;
begin
Synchronize(SysUtils.Beep);
end;
begin
with TMyThread.Create do
WaitForSingleObject(Handle, INFINITE);
//don't call WaitFor since that, in turn, calls CheckSynchronize
end.
Synchronize
никогда не используйте его. Поток не должен зависеть от того, что находится за его пределами. Лучше использовать неблокирующие звонки, такие какPostMessage
или жеTThread.Queue
, Увидетьmghie's ответьте наIs it better to use TThread's “Synchronize” or use Window Messages for IPC between main and child thread? для резюме.
TThread
предоставляет средства для не-VCL-программ для проверки очереди синхронизации, чтобы они могли продолжать использовать многопоточные библиотеки, которые ожидают синхронизации своих методов. Это описано вдокументация дляCheckSynchronize
, Помните, что задачей приложения является проверка очереди, а не вашей библиотеки.
Пока приложение выполняет свою часть договора, ваше использованиеSynchronize
все должно быть в порядке. Если это не так, то ваша программа не будет работать правильно, но я не знаю, какие именно симптомы следует ожидать. Висеть конечно звучит правдоподобно.
I don't know what happens if the host doesn't honor its part of the contract, though.
а затем удалил его, предполагая, что это не так легко ответить
WakeMainThread
это оптимизация Ожидается, что основная нить проснется самаeventually и обратите внимание на новые синхронизированные задачи для выполнения, ноWakeMainThread
Error: User Rate Limit Exceededimmediately, Это сокращает время ожидания.