2012-05-31 103 views
3

我已經使用Swing在Java中編寫了應用程序,現在我正試圖用C++重寫它。 Java中的程序有控制器,該事件引用了Model,View和BlockingQueue。當View新事件發生時被放入BlockingQueue並由Controller和Model處理。然後通過SwingUtilities.invokeLater()在Swing中調用一些操作。將Java應用程序移植到C++(qt)

如何在使用Qt的C++中做這樣的事情?我已經編寫了模型,但我不知道如何通過類似於Java中的BlockingQueue將其與使用Qt編寫的UI連接起來。

+0

您的意思是Java Native Interface? –

回答

1

如果可能,我會避免使用線程。沒有你方的更多澄清,我建議你看看Qt documentation for signals and slots。簡而言之,信號和插槽是Qt中事件處理的默認方式。與小部件交互會導致信號被觸發。你的課程可以將自己連接到這樣的信號並對其做出反應。

我意識到這個答案很模糊。如果添加你想要完成什麼一些更多的細節,我會很樂意更新:)

1

相當於一個BlockingQueue的是在每個QObject固有的。在QObject的Qt文檔中沒有明確說明(像它應該!),但是對於每個QObject,都有一個有效的事件隊列。您可以使用靜態QCoreApplication::postEvent方法從任何線程向任何QObject發佈事件 - 只要您有指向QObject的指針,就可以向其發佈事件。

Qt::QueuedConnection類型的信號插槽連接使用相同的事件隊列來發布內部QMetaCallEvent事件。這些事件被QObject::event()接收,並導致對相關插槽的呼叫。當控制返回到線程的事件循環時,後者查看事件隊列並將事件傳遞給QObject::event()方法。

這些內置事件隊列非常有用,因爲它們固有地允許您序列化對QObject的訪問,因此您不必添加額外的同步基元,並且避免爲死鎖設置自己。使用即席同步會帶來麻煩,不幸的是,即使是Java設計也會出錯。請參閱Herb Sutter關於此主題的優秀曝光:The Many Faces of a DeadlockAvoid Calling Unknown Code While Inside a Critical Section。他有很多其他的publications on this and related topics,這是一個真正的知識寶庫。他還解釋瞭如何設計運行完成,短而甜的異步應用程序以獲得良好的性能。

如果您使用信號插槽和事件發佈將您的設計基於QObject和它們之間的連接,那麼如果您的分析/基準測試表明需要這樣做,則可以將這些QObject中的任何一個移動到專用的QThread。但是,從QWidget派生的任何東西都不能離開GUI線程。

+0

事件隊列是否與QObject或QObject所屬的QThread關聯?我習慣於使用'worker = new QThread'將QObject移動到新的QThread; moveToThread(工人);工人─>開始();'。然後,用'Qt :: QueuedConnection'連接的任何東西都會自動使用該線程的事件隊列。這是你正在談論的隊列嗎? –

+0

對於'QObject'的用戶來說,看起來隊列是特定於對象的,因爲對象的用戶看不到傳遞給任何其他對象的事件,並且無論對象是什麼線程,行爲都是相同的該隊列確實屬於在給定線程中創建的最外層事件循環是實現細節。這對性能有一定的影響,即如果由於這些細節而導致不小心,可能會出現二次行爲。但在大多數情況下,這並不重要。 –