[英]Ending a function in C++
我有一個名為write()
的C ++函數,該函數應該在用戶HDD上寫入大量字節。 這通常需要30秒鍾以上,因此我想為用戶提供從GUI(使用Qt創建) Abort operation
的功能。
所以我有按鈕generate_button
。 當clicked()
此按鈕時,無論其進度在哪里,我都希望有一些東西可以結束該函數。
我考慮過線程,但不確定。 你能給我建議嗎?
我可能會使用一個線程。 檢查變量以查看操作是否已取消應該非常簡單。
使用互斥鎖來鎖定對您的cancel變量的訪問。 這樣可以確保以正確的方式對多個線程進行讀寫。 另一個選擇是,如果您使用的是C ++ 11,請使用原子變量。
將較大的寫操作分成較小的塊。 8至64 KB應該可以工作。 寫入每個塊后,檢查您的cancel變量,如果已設置,請退出線程。
將實際進行編寫的代碼放在工作線程中。 具有一個共享變量(一個原子的或受互斥鎖保護的變量)。 讓工作線程在每次迭代時檢查其值。 如果用戶按下“中止”按鈕,請設置變量的值。
如果這是長期運行的操作, 則應使用線程。
由於您使用的是C ++ 11,因此std::atomic<bool>
可能會為您提供std::atomic<bool>
服務。
線程保證您將擁有響應式GUI。 但是以這種方式使用線程有一個學習曲線。
一種無線程的方法是在您的例程中將其寫入GUI線程中的硬盤驅動器,但給GUI線程留出時間以保持響應。
QObject::connect(my_cancel_button, SIGNAL(clicked()), file_writer, SLOT(setCanceled()));
// open file for writing
QFile file("filename.txt");
file.open(//... );//
while(still_have_data_to_write && !canceled)
{
write( <1 MB of data> ); // or some other denomination of data
qApp->processEvents();// allows the gui to respond to events such as clicks on buttons
// update a progress bar... using a counter as a ratio of the total file size
emit updateProgressBar(count++);
}
if( canceled )
{
file.close();
// delete the partial file using QDir
}
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.