2013-04-23 63 views
0

我有一個用戶界面程序,其中我用QFuture在處理器上沉重的不同類中運行一個函數,並導致我的用戶界面崩潰後,使用QFuture將此線程它工作正常,但我有另一個功能,將需要被調用後,但是這是一個類,在我從中調用它。使用QFuture調用本地類函數

我已經使用了相同的代碼做第二個,但它只是顯示了我還沒有使用,也不知有關Timers錯誤,如果是我的參數使用this其右:

future = new QFuture<void>; 

*future = QtConcurrent::run(this, &GUI::test); 

測試是一個局部的功能,是事做的事實,我不能有兩個併發::運行來電或什麼的,我已經試過看着已經沒有遺憾的是幫助

文檔

基本上,當這被稱爲UI鎖定,我得到一些奇怪的警告,我認爲的重點這是用戶界面不會崩潰

+1

Qt小部件具有線程相關性,您是否在測試中執行了任何必須在GUI線程上完成的任務訪問任何小部件的狀態?這將解釋鎖定。呵呵,線程化的關鍵在於UI不應該被長時間的操作阻塞,而不是它不會崩潰。線程崩潰太容易了;) – 2013-04-23 12:42:32

+0

我更新了qGraphicsView的場景?,任何想法爲什麼我可能會得到這個錯誤,雖然當我不對定時器做任何事情'QObject :: startTimer:定時器不能從另一個線程啓動' – AngryDuck 2013-04-23 12:48:21

+0

我猜想你在內部做的事情啓動一個計時器。 – 2013-04-23 13:01:39

回答

1

這是我最好的猜測。

我猜你有以下情況。 (注意:理解你所處的情況在嘗試提出解決問題的方法時非常有用,通常情況下,OP會以一種根本錯誤的方式處理某些事情,並應該做一些完全不同的事情。)

你有一個GUI。您需要花費很長時間才能在一個工作線程中運行該操作。在長操作結束時,您需要在GUI線程上調用一個函數,可能會更新GUI或類似的東西。

因此,您使用QtConcurrent :: run(& someObject,& SomeObject :: task)啓動後臺任務。然後,在任務完成時,需要通過GUI線程通知某種方式。

這樣做的正確方法是將一個QtFutureWatcher附加到從run()返回的將來,並將GUI類中的一個插槽連接到其完成的信號。 Qt的信號機制將確保在右側線程上調用該插槽。

+0

對不起,我的代碼沒有完成需要很長時間的函數使用我上面顯示的代碼在一個線程上運行我有一個觀察者等待完成的信號,當它得到它調用一個插槽時使用與上面相同的代碼再次調用一個函數,它更新了我的用戶界面上的一個觀察者再次等待完成信號,完成一個插槽被調用,只是std :: cout一個完成的消息,但我得到一個用戶界面崩潰的第二個函數,添加到場景在我的用戶界面? – AngryDuck 2013-04-23 15:56:07

+0

也許你不允許更新工作線程中的場景?我對Qt場景圖表不夠了解。 – 2013-04-23 15:58:53

+0

也許不是...它可以解釋爲什麼用戶界面只是說,即使它已被線程化也不會響應。我在上面的評論中提到了有關Timer警告的任何想法? – AngryDuck 2013-04-23 16:04:22