繁体   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