由於耗時的操作會獨佔系統cpu資源 ,讓介面卡死在那裡,這時需要考慮多執行緒方案,將耗時的操作放在主線程之外的執行緒中執行。
但是必須注意:主介面更新只能在主線程中,耗時操作可以放在新建的執行緒中。
(1) 嘗試方案一 (沒效果)
不採用多執行緒,考慮其替代方案。經過試驗沒有效果,不知道問題出在**,還需要深入學習。
qelapsedtimer et;
et.start();
while(et.elapsed()
< 100)
//沒效果
(2) 嘗試方案二(沒效果)
建立乙個執行緒,子類化qthread並且重寫它的run()函式,
class mythread : public qthread
;void mythread::run()
這裡還碰到乙個很奇怪的問題,通過start()函式執行該執行緒,有時候能進入run()函式,有時候不能進入run()函式,現在記錄下這個問題,留待深入學習。
(3) 解決方案(有效果)
通過qobject::movetothread()函式建立新執行緒,使用這種方法可以很容易地將一些費時的操作放到單獨的工作執行緒中來完成。可以將不同執行緒間的訊號和槽進行關聯,而且這種關聯是安全的。
在執行耗時操作過程中,通過進度對話方塊(qprogressdialog)和定時器(qtimer)來提示使用者:耗時操作正在進行中。
部分**如下:
multithreadtest::multithreadtest(qwidget *
parent, qt::wflags flags)
: qwidget(parent, flags),
ui(new ui::multithreadtestclass)
void multithreadtest::updateviewer(vtkrenderer* renderer)
void multithreadtest::updateprogressdialog()
該demo執行結果圖,第乙個為進度對話方塊;第二個為視網膜視覺化圖,該檢視通過vtk體繪製得到,通過qvtkwidget控制項顯示。
C 多執行緒解決介面卡死問題的完美解決方案
c 多執行緒解決介面卡死問題的完美解決方案 文章 問題描述 當我們的介面需要在程式執行中不斷更新資料時,當乙個textbox的資料需要變化時,為了讓程式執行中不出現介面卡死的現像,最好的方法就是多執行緒 來解決乙個主線程來建立 介面,使用乙個子執行緒來執行程式並更新 主介面這樣就不會出現卡死的現像了...
C 多執行緒解決介面卡死問題的完美解決方案
文章 問題描述 當我們的介面需要在程式執行中不斷更新資料時,當乙個textbox的資料需要變化時,為了讓程式執行中不出現介面卡死的現像,最好的方法就是多執行緒來解決 乙個主線程來建立介面,使用乙個子執行緒來執行程式並更新主介面 這樣就不會出現卡死的現像了 這肯定是沒有問題的,但是為什麼在使用的過程中...
C 多執行緒解決UI介面卡死的問題
乙個經典的例子 問題 都說invoke是同步的,begininvoke是非同步的,但為何用begininvoke做耗時操作依然會卡死ui?小結 begininvoke的非同步是指相對於呼叫begininvoke的執行緒非同步,而不是相對於ui執行緒非同步。所以在ui執行緒呼叫begininvoke依...