C/C++程序都是从main()
函数开始执行的。main()
函数其实就是主进程的入口,main()
函数退出了,则主进程退出,整个进程也就结束了。
而对于使用Qthread创建的进程而言,run()
函数则是新线程的入口,run()
函数退出,意味着线程的终止。复制文件的功能,就是在run()函数中执行的。
1、子线程中不能进行UI操作
Qt中的UI操作,比如QMainWindow、QWidget之类的创建、操作,只能位于主线程
这意味着你不能在新的线程中使用QDialog、QMessageBox等。比如在新线程中复制文件出错,想弹出对话框警告?可以,但是必须将错误信息传到主线程,由主线程实现对话框警告。
因此一般是:主线程负责提供界面,子线程负责无UI的单一任务,通过“信号-槽”与主线程交互
2、QThread中的哪些代码属于子线程
3、如何查看是不是真的实现了多线程?
可以打印出当前线程。对于所有继承自QObject的类,例如QMainwindow、QThread,以及自定义的各种类,可以调用QObject::thread()
查看当前线程,这个函数返回的是一个QThread的指针。例如用qDebug()打印:
在mainwindow.cpp的某个函数里、Q
Thread的run()函数里、自定义类的某个函数里,写上:
qDebug() << "Current thread:" << thread();
对比不同位置打印的指针,就可以知道它们是不是位于同一个线程了。
4、线程终止问题(moveToThread方法:通过信号槽来运行线程程序)
1)通过使用flag标志在控制线程函数的启动和停止,如果不使用该标志位控制线程,当调用thread->quit()和thread->wait()后线程函数仍然在执行,原因是在执行thread->quit()和thread->wait()后,只有线程函数的任务处理完后,线程函数才会停止工作。而线程函数为死循环,所以会一直执行下去。同样道理在窗口关闭时也需要使用标志停止线程函数。
2)启动线程必须使用信号-槽方式,不能直接调用线程处理函数;
同样: 注意不能直接调用run函数,否则还是在主线程里面运行,而不是在新线程里面
3)线程类可以定义多个函数,但是有且只能有一个线程处理函数,比如void MyThread::myTimeout();
转载自:https://www.cnblogs.com/xia-weiwen/p/10306089.html
转载自:https://www.cnblogs.com/Forward-Forever/p/10447597.html