已经有了网站怎么做推广,wordpress 读取用户信息,做网站是先做后台还是前端,手机建网站花钱吗1.先说QT线程。都知道QT线程有两种使用方式#xff0c;一种是继承QThread重写run()#xff0c;一种是继承QObject然后再MovetoThread()到线程下。我也是刚学QT#xff0c;之前一直做MFC。现在有个问题#xff0c;我想要创建的是单次运行的线程#xff0c;就是处理完后就自…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;qRegisterMetaTypeRecogInfo(RecogInfo);}
}RecogInfo1;这是一个简单的结构体类型但是如果需要跨线程传递就需要在使用前加一句
qRegisterMetaTypeRecogInfo(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. 注册后可动态创建和销毁。 注册类型后就可以跨线程使用了。