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)。当控制权回到接受者所在线程的事件循环时,槽函数被调用。这时候需要将信号的参数塞到信号队列里。槽函数在接受者所在线程执行。
在Qt中,子线程不能直接操作UI,应使用信号槽进行线程间通信。线程A接收网口数据并发送信号至线程B,线程B的槽函数接收数据,记录接收字节数。槽函数运行在线程A,而run函数运行在B的线程。根据Qt文档,线程间的信号槽默认采用队列连接,确保安全。
1661

被折叠的 条评论
为什么被折叠?



