2011-04-08 78 views
5

在Windows的C++我可以创建一个句柄事件升压等效于Windows事件

手柄H = CreateEvent(...)

然后我就可以设置和重置该事件

SetEvent的(。 ..)和ResetEvent(...)

最后,我可以使用命令OpenEvent(...)

是否有事件升压equivelent OpenEvents?

+0

您是否需要OpenEvent的多进程IPC方面,还是只需要进程内通信? – Thanatos 2011-04-08 17:53:52

+0

只有在过程中,没有IPC。 – rossb83 2011-04-08 18:12:03

+0

即使不是严格的重复,这个http://stackoverflow.com/questions/1677070/cross-platform-equivalent-to-windows-events问题为您的问题提供了正确的答案。 – Cray 2012-11-25 22:15:47

回答

6

我认为你需要使用boost::mutex,boost::unique_lock,boost::condition_variable和可能的bool为了模仿事件。

实际上您可能需要某种WaitForSingleObject才能等待事件。可能是这样的:

void wait_for_user_input() 
{ 
    boost::unique_lock<boost::mutex> lock(mut); 
    while(!data_ready) 
    { 
     cond.wait(lock); 
    } 
    process_user_input(); // it might be not necessary to hold mutex locked here!!! 
          // if so just add curly braces like this: 
          // void wait_for_user_input() 
          // { 
          // { 
          //  boost::unique_lock<boost::mutex> lock(mut); 
          //  while(!data_ready) { cond.wait(lock); } 
          // } 
          // process_user_input(); 
          // } 



} 
-1

一个提升lock(互斥)会做几乎相同的事情。你可以等这些。

+0

不一定。我想在线程A中持续运行一个while循环,直到线程B触发一个事件。 – rossb83 2011-04-08 17:56:35

+0

所以在你的循环里面使用“timed_lock(mutex,timeout)” – 2011-04-08 18:03:36

+0

我不想让任何时间进场。我只是想要一个事件触发器。当用户点击导致事件的按钮时。 – rossb83 2011-04-08 18:10:16

-1

你需要的是从boost interprocess librarynamed_condition variable。与Windows事件的主要区别在于,您必须将它们与named_mutex结合使用。

请注意,您可以在单个进程中使用这些boost进程间基元。我假设你需要这些,因为你正在使用OpenEvent(这意味着通过使用名称来共享对象)。如果您可以避免使用名称,则可以使用boost thread库中的非命名变体。

+3

根据作者不需要IPC。除了'name mutexes'外,如果应用程序崩溃不会自动删除。因此,在添加了命名互斥锁之后,他或她也必须以某种方式处理这个伪装。恕我直言,它只是造成不必要的复杂性。 – 2011-04-08 18:25:45

4

线程安全Boost Signals2库可能对您有用。最初的信号库不是线程安全的,但是实现了一个信号/插槽框架,它离事件的想法不远。由于Signals2是线程安全的,因此您应该能够使用它来在线程之间传递事件。