QT 线程常见需要注意的问题

1 篇文章 0 订阅

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

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值