2011-04-08 63 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是線程安全的,因此您應該能夠使用它來在線程之間傳遞事件。