2009-10-16 83 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