Qt QThread

多线程考虑的几件事:

  • 实例变量属于哪个线程?(不是在子线程中定义的,都是主线程,假设只有俩线程,多了以此类推)。
  • 在哪个线程定义的实例变量的函数都是在该线程中执行的。
  • 连接线程的事件(信号与槽),属于跨线程通讯,还是本线程通讯。
  • 可以通过moveToThread(QThread)来改变该变量的所属范围(即该实例变量移到了这个线程)

主要把握实例变量的所属问题,然后考虑多线程调度是否会访问同一变量,是否需要加锁。加锁后是否因为不当代码导致了死锁问题。

线程应该是一个重量级的东西,应该考虑成类似main程序的入口问题,而不是执行代码段的一个小工具。要建立这种层次概念。

入口问题的编程模式:

class MyObject:Object
{
public slots:
    void func(){...}
    void func(){...}
}

int main()
{
    MyObject obj;
    QThread thread;
    obj.moveToThread(&thread);
    connect(&other,SIGNAL(),&obj,SLOT(func));
    thread.start();
}

这里可能connect并不像这么用(这里只是一个范例,在主函数连接了这个信号与槽),可能是在某个自定义的类下的构造函数里,只要让该对象移入线程内,然后如果增加信号槽,可能是引用该变量,有时可能需要在类中去move到该线程,没关系,引用该线程变量即可。

以前的错误用法(或者说不太好的方式)是继承qthread,然后move,this。这样在代码依附在线程中,实例了该线程就表示内部代码也一起糅进去了。

好的方式是,单独的qthread,各个功能是独立的,然后移入到该线程中。最后线程运行,各个功能代码也运行起来。

分类:软件工程 时间:2015-05-12 人气:488
本文关键词:
分享到:

相关文章

iOS 开发

Android 开发

Python 开发

JAVA 开发

开发语言

PHP 开发

Ruby 开发

搜索

前端开发

数据库

开发工具

开放平台

Javascript 开发

.NET 开发

云计算

服务器

Copyright (C) codeweblog.com, All Rights Reserved.

CodeWeblog.com 版权所有 闽ICP备15018612号

processed in 0.033 (s). 12 q(s)