2009-10-16 71 views
0

我正在創建一個實現進程間通信的應用程序。 爲此,我設置了一個共享緩衝區,這似乎工作正常。 現在,我需要一種數據生成應用程序(使用C++編寫) 來告訴數據接收應用程序(用freepascal/lazarus編寫) 何時應該讀取數據。Win32 Mutex不等待

我正在嘗試爲此使用互斥鎖。我沒有太多的Windows API編程經驗。

所以,我的問題是,在下面的FreePascal代碼中,互斥鎖不會等待。我可以調用TMutex.Wait()函數,它不返回任何錯誤或任何錯誤,但它不會等待。

構造函數TMutex.Create(sName:AnsiString);
begin
    sName:='Local \ Mutex'+ sName;
    hMutex:= CreateMutexA(
               爲零,//默認訪問
               真,//最初並不擁有
                PChar(sName)); //命名互斥
   如果hMutex = 0然後
   開始
       提高Exception.Create( '互斥創建失敗');
    end;
end;

析構函數TMutex.Destroy;
begin
    CloseHandle(hMutex);
end;

程序TMutex.Wait; (WaitForSingleObject(hMutex,INFINITE)<> 0)then ShowMessage('debug:wait returned something');如果(WaitForSingleObject(hMutex,INFINITE)<> 0)
end;

程序TMutex。帖子;
begin
    ReleaseMutex(hMutex);
end;

+0

命名管道是爲此目的而發明的:IPC - 通過共享內存 - 基於方便的基於ReadFile/WriteFile的API – 2009-10-17 20:52:34

回答

2

它看起來像你的問題是:

True, // initially not owned 

你向後有事情 - 真正意味着它最初所擁有,所以等待它會立即返回。

+0

嘗試了真假,似乎沒有什麼區別。我原來是假的,將它改爲true,看看這是否改變了什麼,但沒有更新評論。由於它沒有改變任何東西,我開始尋找其他地方,忘記了這一點。儘管如此,將ti設置爲false並不會改變任何內容。 – 2009-10-17 18:36:08

0

您不向我們展示調用TMutex的Wait方法的代碼。然而,你必須知道一個互斥體是可重入的:如果一個線程擁有一個互斥體,它將永遠被授予對它的訪問權限,因此等待將永遠不會被阻塞。這是嵌入到互斥體中以避免死鎖。

嘗試從另一個線程獲取互斥鎖,等待應該阻止。

+0

謝謝,我會試試這個。我會告訴它,如果它稍後工作。 – 2009-11-04 21:10:54

+0

好吧,現在我得到 使用sharedmem; procedure TIPCThread.test; begin ShowMessage('blaat') end; procedure TIPCThread.Execute; begin Synchronize(@Test); BlaatSharedMem.Mutex.Wait; Synchronize(@Test); 結束; 仍然....我得到了兩個ShowMessages之間沒有等待。正如你所看到的,我確實在這裏開始一個新的線程,我在等待,但沒有區別,它不會等待。 – 2009-11-08 11:42:30