1. 程式人生 > >qt延時之QApplication::processEvents詳解

qt延時之QApplication::processEvents詳解

應用場景一:處理密集耗時的事情

有時候需要處理一些跟介面無關的但非常耗時的事情,這些事情跟介面在同一個執行緒中,由於時間太長,導致介面無法響應,處於“假死”狀態。例如:在應用程式中儲存檔案到硬碟上,從開始儲存直到檔案儲存完畢,程式不響應使用者的任何操作,視窗也不會重新繪製,從而處於“無法響應”狀態,這是一個非常糟糕的體驗 。
     在這種情況下,有一種方法是使用多執行緒,即在子執行緒中處理檔案儲存,主執行緒負責介面相關。
     而如果不想使用多執行緒,最簡單的辦法就是在檔案儲存過程中頻繁呼叫QApplication::processEvents()。該函式的作用是讓程式處理那些還沒有處理的事件,然後再把使用權返回給呼叫者。

bool MyApp::writeFile(const QString &filename)
{
     QFile file(filename);
...
    QApplication::setOverrideCursor(Qt::WaitCursor);
     for(int r = 0; r != rowCount; ++r)
     {
          for(int c = 0; c != colCount; ++c)
          {
               out << table(r,c);   
               qApp.processEvents();
          }
     }
    QApplication::restoreOverrideCursor();
}

應用場景二:非阻塞延時


QTime time;

time.start();

while(time.elapsed() < 1000)             //等待時間流逝1秒鐘

    QCoreApplication::processEvents();   //不停地處理事件,讓程式保持響應