簡體   English   中英

在C ++中結束函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM