2013-05-13 143 views
2

我有一個工作線程(pthread)來處理背景上的一些事情,然後我想在屏幕上顯示結果。所以我必須在UI線程或主線程上執行一些代碼。如何在UI線程上執行一些代碼

在iOS中,我可以使用dispatch_async(dispatch_get_main_queue(), ^{ /* My code */ });,在Android中我可以使用View.queueEvent()。任何人都可以告訴我如何與BB 10原生SDK相同的東西?

感謝,

解決方案更新。

我終於弄清楚了2種方法,第一種方法很簡單,但它不起作用,我不知道爲什麼。如果有人想看,我把它放在這裏。

方法1.

使用bps_channel_exec擁有該通道的線程上執行一些代碼。在UI線程上創建一個通道,然後將其設置爲活動狀態。在工作線程上,通過調用bps_channel_get_active來獲得活動通道,然後使用bps_channel_exec。但它不適合我,繼續找到原因。

方法2:

這種方法比較複雜,但想法很簡單。在工作線程上,將事件推送到UI線程。在UI線程主循環中,添加一個事件處理程序來處理事件類型。

在工作線程上:通過調用bps_register_domain來註冊域,然後通過調用bps_event_create來使用域創建一個事件。接下來,通過調用bps_channel_push_event將事件推送到UI線程上的活動通道。

在UI線程主循環:

for (;;) { 
    bps_event_t *event = NULL; 
    bps_get_event(&event, -1); 

    if (event) { 
     if (bps_event_get_domain(event) == the_domain_that_is_mentioned_above) { 
     // Handle the event 
     } 
    } 

    ... 
} 

有一個很好的樣本 here

回答

3

您應該使用信號和插槽。發送到對象的事件在它們的事件循環中執行,發送到UI對象的ergo信號排隊並在UI線程中執行。

此外,您應該考慮使用Qt's thread API(另請參閱that one),這樣可以更輕鬆地與應用程序的其他部分進行集成。根據我的經驗,如果您的工作線程大多需要單向(線程 - >應用程序的其餘部分)通信,則使用QtConcurrent::run,如果worker是複雜對象,則考慮啓動線程(這將創建並啓動一個線程事件循環信號/插槽),然後實例化對象並將它們推送到工作線程。然後發送給它們的信號將排隊並在新線程中執行。

我不記得我在哪裏看到這個建議,但是如果你在connect statements中指定last argument,你通常會做錯事,至少我做過。默認行爲確實覆蓋了99.9%的案例。如果信號阻塞UI線程,則對象層次結構/線程關聯中的某些內容是錯誤的。弄錯它很容易。

如果你在QML了你的用戶界面,看到C++ SIGNAL to QML SLOT in Qt

+0

我不使用級聯,所以我不能用QT相關的API。最後,我得到了它的工作,解決方案更新。 – TienDC 2013-05-16 09:47:13

+0

你對你的UI有什麼用處? – Jean 2013-05-16 13:46:30

相關問題