Win32 Mutex не ждет

Я создаю приложение, реализующее межпроцессное взаимодействие. Для этой цели я установил общий буфер, который, кажется, работает нормально. Теперь мне нужен способ для приложения, генерирующего данные (написанного на C ++), чтобы сообщить приложению, принимающему данные (написанному на freepascal / lazarus), когда оно должно читать данные.

Я пытался использовать для этой цели мьютекс. У меня нет большого опыта программирования Windows api.

Итак, моя проблема в том, что в приведенном ниже коде FreePascal мьютекс не будет ждать. Я могу вызвать функцию TMutex.Wait (), она не возвращает ошибку или что-то еще, но просто не ждет.

конструктор TMutex.Create (sName: AnsiString);
begin
sName: = 'Local \ Mutex' + sName;
hMutex: = CreateMutexA (
nil, // доступ по умолчанию
True, // изначально не принадлежал
PChar (sName)); // именованный мьютекс
если hMutex = 0, то
начало
поднять исключение.Create ('Ошибка создания мьютекса');
end;
end;

деструктор TMutex. Destroy;
begin
CloseHandle (hMutex);
end;

процедура TMutex.Wait;
begin
if (WaitForSingleObject (hMutex, INFINITE) ‹> 0) then ShowMessage ('отладка: ожидание что-то вернуло');
конец;

процедура TMutex.Post;
начало
ReleaseMutex (hMutex);
конец;


person André van Schoubroeck    schedule 16.10.2009    source источник
comment
Для этой цели были изобретены именованные каналы: IPC - через разделяемую память - с удобным API на основе ReadFile / WriteFile.   -  person Chris Becke    schedule 18.10.2009


Ответы (2)


Похоже, ваша проблема в:

    True, // initially not owned

У вас есть вещи наоборот - true означает, что изначально он принадлежит, поэтому ожидание вернется немедленно.

person Jerry Coffin    schedule 16.10.2009
comment
пробовал как истину, так и ложь, похоже, не имеет значения. У меня изначально было false, я изменил его на true, чтобы посмотреть, изменилось ли это что-нибудь, но не обновил комментарий. Поскольку это ничего не меняло, я стал искать в другом месте и забыл об этом. Тем не менее, установка ti обратно в значение false ничего не меняет. - person André van Schoubroeck; 17.10.2009

вы не показываете нам код, который вызывает метод Wait, TMutex. однако вы должны знать, что мьютекс является реентерабельным: если поток владеет мьютексом, ему всегда будет предоставлен доступ к нему, поэтому ожидание никогда не будет блокироваться. это встроено в мьютекс, чтобы избежать взаимоблокировок.

попробуйте получить мьютекс из другого потока, ожидание должно заблокироваться.

person Adrien Plisson    schedule 04.11.2009
comment
Хорошо, теперь у меня есть использование sharedmem; процедура TIPCThread.test; begin ShowMessage ('blaat') end; процедура TIPCThread.Execute; начать синхронизацию (@Test); BlaatSharedMem.Mutex.Wait; Синхронизировать (@Test); конец; Тем не менее .... Я получил два сообщения ShowMessage без ожидания между ними. Как вы видите, я начал здесь новую ветку, в которой я ожидаю, но без разницы, она вообще не ждет. - person André van Schoubroeck; 08.11.2009