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,各个功能是独立的,然后移入到该线程中。最后线程运行,各个功能代码也运行起来。


你可能感兴趣的:(Qt QThread)