我有一个名为write()
的C ++函数,它应该在用户HDD上写入大量字节。这通常需要超过30秒,所以我想让用户能够从GUI(使用Qt创建)Abort operation
。
所以我有按钮generate_button
。当这个按钮是clicked()
时,我想要有一些东西来结束它的功能,无论它的进展在哪里。
我想到了线程,但我不确定。你能告诉我一下吗?
答案 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
}
希望有所帮助。