Qt中多线程的一种使用

系统需要在子窗体中进行一个耗时的数据融合过程,之前意识到UI所在的主线程会被卡死的情况,但因为赶进度需要扩展新功能就暂时没顾上,只用了一种相对妥协的方法,QProgressDialog用于进度的显示,结果是在我的电脑测试没问题,进度条可以活动,但是交给别人还是会出现点击出现卡死,根本原因还是主线程被阻塞。现在终于不想再将就它了,就果断使用多线程改造之,之后发现真的是太爽了,不仅能解决之前的问题还能方便地与主线程进行交互,并且将之前的单任务、单线程的操作一跃成为多任务、多线程。实现方法网上有很多资料,最多的应该就是采取继承QThread的方法,但是我个人比较排斥这种做法,原因就是这种方法并没有从QThread类的立意出发,也即是很容易使人混淆该类的作用,其实他就是一个用来管理线程的功能类而不是线程本身,所以使用一种比较容易理解的QObject::moveToThread(QThread *),这种用起来也很方便而且我可以继承QObject类之后在其中定义多个槽函数,就可以供不同场景下使用同一个QObject对象进行多线程也算是压缩项目容量(不想写的太大,毕竟要考虑方便交接)。


obj=new MyObj;
obj->moveToThread(thrd);
thrd->start();  
connect(thrd, SIGNAL(started()), obj, SLOT(go()));  
connect(thrd, &QThread::finished, obj, &QObject::deleteLater);  
connect(obj, SIGNAL(over()), this, SLOT(threadOk()));



thrd=new QThread;操作可以在构造函数中进行,这样方便在threadOk()槽函数中进行quite和wait操作,只需在析构的时候delete即可,但是我比较郁闷的一点是即使thrd指针绑定到this中最后delete时也不报错,这说不通,理论上所在对象this析构时会自动delete。所以我猜想是显式在析构函数中delete该对象时就不会再重复delete了。


over信号是自定义的MyObject类中的,用于与主线程通信,告知进度等操作,方便使用进度条或MessageList。


注:需要强调一点,因为有可能在MyObject类中有多个操作即多个槽函数(正如前面所说是为了压缩项目容量),所以要避免多个操作之前冲突,尤其是使用第三方库时有时是开源库需要大量附加包含库目录,很可能造成一些奇奇怪怪的错误例如:缺少“{”在函数之前,而这些错误往往出现在外部文件中,这些地方一般是不可能错的,所以基本都是变量或宏定义出现的重定义或者冲突之类的,由此得出最有效的避免这种情况出现的做法是:1)一定不要在头文件中使用统一命名空间(如,using namespace std;)2)变量的定义尽量有意义和个性化避免与第三方库中的变量或宏冲突,即使是局部变量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值