在C ++中结束一个函数

时间:2014-02-27 20:44:01

标签: c++ qt function

我有一个名为write()的C ++函数,它应该在用户HDD上写入大量字节。这通常需要超过30秒,所以我想让用户能够从GUI(使用Qt创建)Abort operation

所以我有按钮generate_button。当这个按钮是clicked()时,我想要有一些东西来结束它的功能,无论它的进展在哪里。

我想到了线程,但我不确定。你能告诉我一下吗?

3 个答案:

答案 0 :(得分:2)

我可能会使用一个帖子。检查变量以查看操作是否已被取消应该非常简单。

使用互斥锁锁定对取消变量的访问权限。这将确保以适当的方式为多个线程读取和写入。 Another option is if you are using C++11 use an atomic variable.

将大写写入较小的块。 8到64千字节应该工作。写完每个块后,检查取消变量,如果设置,退出线程。

答案 1 :(得分:2)

将实际执行写入的代码放在工作线程中。有一个共享变量(一个是原子的,或由互斥锁保护)。让工作线程在每次迭代时检查其值。如果用户按下“中止”按钮,则设置变量的值。

如果这是一个长时间运行的操作,应该使用线程。

由于您使用的是C ++ 11,std::atomic<bool>可能很适合您。

答案 2 :(得分:1)

线程保证您将拥有响应式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
}

希望有所帮助。