應用場景一:處理密集耗時的事情
有時候需要處理一些跟界面無關的但非常耗時的事情,這些事情跟界面在同一個線程中,由於時間太長,導致界面無法響應,處於“假死”狀態。例如:在應用程序中保存文件到硬盤上,從開始保存直到文件保存完畢,程序不響應用戶的任何操作,窗口也不會重新繪制,從而處於“無法響應”狀態,這是一個非常糟糕的體驗 。
在這種情況下,有一種方法是使用多線程,即在子線程中處理文件保存,主線程負責界面相關。
而如果不想使用多線程,最簡單的辦法就是在文件保存過程中頻繁調用QApplication::processEvents()。該函數的作用是讓程序處理那些還沒有處理的事件,然后再把使用權返回給調用者。
1 bool MyApp::writeFile(const QString &filename) 2 { 3 QFile file(filename); 4 ... 5 QApplication::setOverrideCursor(Qt::WaitCursor); 6 for(int r = 0; r != rowCount; ++r) 7 { 8 for(int c = 0; c != colCount; ++c) 9 { 10 out << table(r,c); 11 qApp.processEvents(); 12 } 13 } 14 QApplication::restoreOverrideCursor(); 15 }
應用場景二:非阻塞延時
1 QTime time; 2 time.start(); 3 while(time.elapsed() < 1000) //等待時間流逝1秒鍾
4 QCoreApplication::processEvents(); //不停地處理事件,讓程序保持響應