QT 线程之间通信

1.先说QT线程。都知道QT线程有两种使用方式,一种是继承QThread重写run(),一种是继承QObject然后再MovetoThread()到线程下。我也是刚学QT,之前一直做MFC。现在有个问题,我想要创建的是单次运行的线程,就是处理完后就自动退出线程,常用于设备连接。都知道使用start()启动线程,但是线程处理完后并没有自动退出,而是需要判断isrunning后再quit,然后重复movetothread->start才能重新启动线程,当然这时的线程ID会变化。
2.假设要启动多线程,那就要new多个QThread。我的处理函数都是在一个QObject里面,如果仅仅是new一个QObject处理对象,但就需要处理好线程同步的问题。我是直接一个QObject对应一个QThread,既然是不同的对象副本那就不需要考虑线程同步问题,我不知道这样有没有什么问题,需要的空间代价肯定是比较高。
3.不同线程之间共享数据,一个是全局变量,做好同步互斥就可以。现在要说的是信号与槽函数的方式。主要涉及两种信号类型:Qt::DirectConnection(直连方式:同步),
Qt::QueuedConnection(排队方式:异步)
显然在同一个线程里用信号是使用同步的方式就好。但是在不同线程中,更需要的是异步的方式。信号槽传递的参数可以有很多,这里只说传递的自定义结构体。代码如下:
结构体:

typedef struct RecogInfo
{
     
    QString strServerIP;
    QString strGanID;
    int AllTransSize;
    int OBUSize;
    int CPCSize;
    int AllMatchSize;
    int OBUMatchSize;
    int CPCMatchSize;
    RecogInfo()
    {
     
        strServerIP = "";
        strGanID = "";
        AllTransSize = 0;
        OBUSize = 0;
        CPCSize = 0;
        AllMatchSize = 0;
        OBUMatchSize = 0;
        CPCMatchSize = 0;
        qRegisterMetaType<RecogInfo>("RecogInfo");
    }
}RecogInfo1;

这是一个简单的结构体类型,但是如果需要跨线程传递就需要在使用前加一句:

qRegisterMetaType<RecogInfo>("RecogInfo");

这里我是直接写在构造函数里面了。如果没有这句DEBUG会输出错误:

QObject::connect: Cannot queue arguments of type 'RecogInfo'
(Make sure 'RecogInfo' is registered using qRegisterMetaType().)13:38:40: Debugging has finished

按照提示照做就好了。
具体原因我也不太懂,参照MFC消息机制,线程传递消息也是需要New出来一块内存去存储,因为是异步的,如果传的是局部变量,当消息还未被目标线程处理时该变量就被析构了,消息到来处理函数不知道去哪找传递的数值。QT手册有这么一句话:After a type has been registered, you can create and destroy objects of that type dynamically at run-time.
注册后可动态创建和销毁。
注册类型后就可以跨线程使用了。

你可能感兴趣的:(QT,qt,多线程)