我做了一个功能,允许用户删除某个目录下的全部文件,删除的时候有一个进度条对话框和一个按钮,允许用户中断这个过程。
MyDialog::OnCancel()
{
emit SigCancel(); // 发信号给MyThread::OnStop()槽函数
}
MyThread::OnStop()
{
// 会收到信号并执行这个函数
this->m_stop = true;
emit SigCancel(); // 再次发送信号。之所以要这样中转,而没有通过MyDialog直接发送给tool对象,是因为tool对象是run()函数里当场申请的对象,没有提前预知。
}
MyThread::run()
{
MyTool tool;
connect(this, signal(SigCancel()), &tool, slot(ChangeVar()));
tool.DeleteAllFiles();
}
MyTool::ChangeVar()
{
// 这个函数的目的是,改变这个类的某个bool变量,使这个类的DeleteAllFiles()能够早点跳出这个循环
m_not_delete = true;
}
MyTool::DeleteAllFiles()
{
for (i=0; i<files.count(); i++) {
if (m_not_delete) break;
// 真正每次删除一个文件
files.at(i).delete();
}
}
问题1:当用户按了这个按钮以后,会发信号到线程(MyThread)的槽里,然后线程的槽里再次发信号给某个类(MyTool)的槽函数。可问题是,我发现MyTool没有接收到这个信号。请问这是怎么回事?
问题2:UI线程发给子线程信号,即使子线程的槽函数接受到了,那么它应该何时执行这个槽函数的内容?因为子线程在永远不停的执行DeleteAllFiles();里的内容,循环往复,永远不停,那么子线程何时才会切换到执行槽函数的内容?我的问题1是不是因为这个原因造成的?
附带解释:子线程发信号给UI线程,很容易,很好用,我已经实现使用了。因为即使UI线程有可能在忙,但总有停下来的时候(因为UI线程大部分时间都在等人来操作),但子线程却不是这样,有可能永远在工作,一旦工作完毕就有可能彻底退出和销毁了线程。所以UI线程给工作线程发信号,是一个很奇怪的问题。