Вопрос по multithreading – Опасно ли использовать синхронизацию в приложении без VCL?

12

Если 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 call CheckSynchronize directly or in a WakeMainThread handler a secondary thread runs and executes Synchronize(SomeMethod) like in the example above

Будет ли поток зависать в строке Synchronize (SomeMethod)?

@DavidHeffernan Я могу представитьsynchronize(CallEventHandler) в библиотеке, где я могу назначить метод для обработчика событий. Компилятор не будет жаловаться, если это приложение не VCL. mjn
@Rob Если код является плагином, например, то это не будет жизнеспособным. David Heffernan
Является ли приложение без VCL под вашим контролем? Если нет, то вы не можете использоватьSynchronize. David Heffernan
@Rob Если приложение не находится под вашим контролем, то как оно будет вызывать CheckSynchronize? Я думаю, что мы согласны здесь. David Heffernan
Конечно, компилятор не будет жаловаться. Это не имеет ничего общего с синтаксисом команды или областью действия идентификаторов. Но @David не так, что вы не можете использоватьSynchronize, Вы можете использовать все, что вы хотите. Вам просто нужно сообщить о том, что вы используете его, чтобы потребитель вашей библиотеки знал, как его использовать.CheckSynchronize, Я не знаю, что произойдет, если хост не выполнит свою часть контракта. Не стесняйтесь написать тестовую программу и сообщить свои результаты здесь. Rob Kennedy

Ваш Ответ

3   ответа
1

ми приложениями, я бы не советовал использоватьSynchronize() вообще, так как ваша нить не имеет понятия о том, что происходит вне ее. Лучше выбрать поток, представляющий событие обратного вызова, которое поток может вызвать в своем собственном контексте, когда это необходимо, а затем позволить приложению предоставить обработчик функции обратного вызова, который при необходимости решит, как лучше синхронизироваться с основным потоком приложения. ,

6

Да, это опасно. Если ваш основной поток не звонит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 call CheckSynchronize 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.
+1, и о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? для резюме.
9

TThread предоставляет средства для не-VCL-программ для проверки очереди синхронизации, чтобы они могли продолжать использовать многопоточные библиотеки, которые ожидают синхронизации своих методов. Это описано вдокументация дляCheckSynchronize, Помните, что задачей приложения является проверка очереди, а не вашей библиотеки.

Пока приложение выполняет свою часть договора, ваше использованиеSynchronize все должно быть в порядке. Если это не так, то ваша программа не будет работать правильно, но я не знаю, какие именно симптомы следует ожидать. Висеть конечно звучит правдоподобно.

Извините за удаление моего предыдущего комментария! Я прочитал в вашем комментарииI don't know what happens if the host doesn't honor its part of the contract, though.  а затем удалил его, предполагая, что это не так легко ответить mjn
Фоновый поток блокируется до тех пор, пока не будет вызван CheckSynchronize. Что еще могло случиться?
Error: User Rate Limit Exceededfor me ответить, потому что у меня нигде не установлена Delphi для его тестирования. Ты сделаешь.
Error: User Rate Limit ExceededWakeMainThread это оптимизация Ожидается, что основная нить проснется самаeventually и обратите внимание на новые синхронизированные задачи для выполнения, ноWakeMainThreadError: User Rate Limit Exceededimmediately, Это сокращает время ожидания.
Error: User Rate Limit Exceeded mjn

Похожие вопросы