Qt创建的子线程中是不能对UI对象进行任何操作的,即QWidget及其派生类对象,这个是我掉的第一个坑。可能是由于考虑到安全性的问题,所以Qt中子线程不能执行任何关于界面的处理,包括消息框的弹出。正确的操作应该是通过信号槽,将一些参数传递给主线程,让主线程去处理。
线程A描述:
线程A负责接收网口的数据,每接收一次数据就发送信号至B线程。
线程B描述:
线程B负责接收A的网口数据并进行处理,B中的槽函数用于接收A的网口数据,B的run()函数重载用于处理A的网口数据;
线程B中槽函数负责接收线程A的数据,线程B中有一个接收计数,用于记录接收的字节数,线程B是重载run函数实现,负责处理接收的网口数据。
现象描述
线程b的槽函数的线程ID为线程A的线程ID,线程B的run函数中的线程ID是B的线程ID;
且看文档怎么说
-
自动连接(AutoConnection),默认的连接方式。如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接。
-
直接连接(DirectConnection)。当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行。
-
队列连接(QueuedConnection)。当控制权回到接受者所在线程的事件循环时,槽函数被调用。这时候需要将信号的参数塞到信号队列里。槽函数在接受者所在线程执行。