Что-то еще является объяснением вашей проблемы, потому что TMutex::Acquire
действительно получает блокировку объекта мьютекса. Реализация TMutex
выглядит так:
procedure TMutex.Acquire;
begin
if WaitFor(INFINITE) = wrError then
RaiseLastOSError;
end;
procedure TMutex.Release;
begin
if not ReleaseMutex(FHandle) then
RaiseLastOSError;
end;
И WaitFor
вызывает WaitForMultipleObjectsEx
передачу дескриптора мьютекса.
Скорее всего, у вас есть несколько мьютексов, но я не могу сказать точно, так как не вижу весь ваш код.
Наконец, для синхронизации процессов вы должны предпочесть критическую секцию Windows, которая работает лучше, чем объект мьютекса Windows. Это TCriticalSection
в RTL.
После вашего обновления легко увидеть, что происходит. Все использование замка происходит в основном потоке. Вы вызываете Synchronize
, в результате чего метод выполняется в главном потоке. Если вы вызываете CheckLock
непосредственно из вашего Execute
метода, то вы зашли в тупик, как и предполагалось.
Вам необходимо использовать Synchronize
для всех вызовов GUI. В целом он работает, сигнализируя основному потоку, что в очереди синхронизации что-то есть, а затем ожидая, пока основной поток завершит работу. Это асинхронный метод.