2009-10-16 6 views
0

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

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

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

конструктор TMutex.Create (sName: AnsiString);
начало
    sName: = 'Local \ Mutex' + sName;
    hMutex: = CreateMutexA (
                ноль, // по умолчанию доступ
                Правда, // изначально не принадлежит
                PChar (sName)); // с именем мьютекс
    если hMutex = 0, то
    начинают
        поднять Exception.Create ('создание мьютекс не удалось');
    конец;
конец;

деструктор TMutex.Destroy;
начало
    CloseHandle (hMutex);
конец;

процедура TMutex.Wait;
начинают
    если (WaitForSingleObject (hMutex, INFINITE) <> 0), то ShowMessage ('отладки: ждать возвращенное что-то');
конец;

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

+0

Именованные каналы были изобретены для этой цели: IPC - через общую память - с помощью удобного API-интерфейса на основе ReadFile/WriteFile –

ответ

2

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

True, // initially not owned 

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

+0

, который испробовал как истинные, так и ложные, похоже, не имеет значения. Я сделал это изначально ложным, изменил его на true, чтобы увидеть, изменилось ли это что-либо, но не обновил комментарий. Поскольку это ничего не изменило, я начал искать в другом месте и забыл об этом. Тем не менее, установка ti обратно на false ничего не меняет. –

0

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

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

+0

спасибо, я попробую это. Я скажу, будет ли это работать позже. –

+0

Хорошо, теперь я получил использует sharedmem; процедура TIPCThread.test; начало ShowMessage ('blaat') end; процедура TIPCThread.Execute; begin Synchronize (@Test); BlaatSharedMem.Mutex.Wait; Синхронизация (@ Тест); конец; Все еще .... У меня есть два ShowMessages без ожидания между ними. Я начал новую тему здесь, как вы видите, в которой я делаю ожидание, но никакой разницы, он не ждет. –