class gui:public dialog { // 主线程
private:
A *a;
B *b;
};
connect(a, SIGNAL(sendData(QByteArray)), b, SLOT(getData(QByteArray)));
connect(b, SIGNAL(sendData(QByteArray)), a, SLOT(getData(QByteArray)));
class A:public QThread{ // 串口读写数据
protected:
virtual void run();
private slots:
void getData(QByteArray &); // 应该是在主线程里运行的
siganls:
sendData(QByteArray &);
}
class B:public QThread{ // 串口数据处理线程
protected:
virtual void run();
private slots:
void getData(QByteArray &); // 应该是在主线程里运行的
siganls:
sendData(QByteArray &);
}
这样做岂不是gui主线程在中间做桥梁?怎么样才能不用主线程做桥梁呢?有遇到同样问题的朋友吗,你们是怎么处理的
------解决方案--------------------
A,B不从QTread继承,继承自QObject,
分别实现串口读 和 处理功能
A a;
B b;
a.moveToThread(thread1);
b.moveToThread(thread2);
这样的结构会不会就是两个线程里分别运行了,你可以试下,我没试。。
------解决方案--------------------
关键代码你都没给,比如run()内有没有事件循环,线程的启动等
不过串口属于慢速的IO吧,用得着这么多线程么?
------解决方案--------------------
重写虚函数run,通过事件循环或信号都可以让双线程进行交互
------解决方案--------------------
没有太明白你的问题,要想做到与GUI无关,你只需要让a,b两者自己去处理就好,随便举个例子,把b丢到a里面去进行信号的连接,发送处理就OK, 因为线程间的信号槽是走消息队列,所以性能多少要差一些,也可以直接让线程间通过信号量来进行同步,或者加回调函数来处理,性能会好一些。
------解决方案--------------------
利用两个线程的状态改变为通信
void A::run(){
while(!isstop){
swicth(sate){
case:onecase
.....
}
void B::run(){
while(!isstop){
swicth(sate){
case:onecase
.....
}