c++ - QtSerialPort 在错误的线程中实例化,导致信号/插槽失败

标签 c++ qt serial-port qthread qtserialport

我正在使用 QtSerialPort通过 USB 与虚拟 COM 端口通信的库。 COM 端口返回数据并在使用 QtSerialPort 给出的示例项目对其进行测试时正常工作,但当我将其作为我的项目的一部分运行时失败。

我检查了导致 QtSerialPort 被实例化的实例化链和线程,发现了一些奇怪的东西。结果如下。

main()
  MainWindow (Thread 0xbf8dbe0)        // Thread "A"
    HardwareManager (Thread 0xbf8dbe0) // Thread "A"
      QSerialPort (Thread 0xbfb95f0)   // Thread "B" !?

在我的代码中,main() 函数实例化了一个 MainWindow,后者又实例化了一个 HardwareManager 并将其存储为私有(private)变量。实例化 HardwareManager 时,它还会实例化 QSerialPort 实例,以便它可以正确地与 COM 端口通信。

但是,您会注意到上面的 my QSerialPort 与父对象以及它的父对象位于不同的线程中(它在线程 B 中,而两个祖先都在线程 A 中) .我认为其他线程导致我的信号/插槽失败。如果我dumpObjectInfo ,它列出了我的信号/插槽正在设置,但事件从未触发。

this->serial = new QSerialPort();
connect(this->serial, SIGNAL(readyRead()), this, SLOT(readSerialData());

上面是我用来创建新串行端口并将其连接到正确插槽的代码。实际的波特率、奇偶校验和数据/停止位配置分别发生(并且工作正常,如 QtSerialPort 提供的示例应用程序中测试的那样)。

有没有人知道为什么这个特定对象(QSerialPort 实例)在不同的线程中被实例化?我试过“moveToThread”来切换线程关联,但似乎没有任何效果。

我还制作了一个 post on the Qt Project Forums , 但还没有任何有用的回复。

编辑: 以下是调用链中的相关代码:

// main()
QApplication a(argc, argv)
MainWindow window = new MainWindow(); // [1]
MainWindow.show();
return a.exec();

// MainWindow::MainWindow() [1]
this->toolController = new QtToolController(this);
HardwareManager *manager = new HardwareManager(this->toolController); // [2]

// HardwareManager::HardwareManager() [2]
this->serial = new QSerialPort();
connect(this->serial, SIGNAL(readyRead()), this, SLOT(readSerialData()));

当 QSerialPort 准备好被读取时(它有数据要提供),它会触发 readyRead 信号(至少,它应该如此)。该信号在 Qt 示例项目中正确触发,但我从未在我的应用程序中收到该信号。我相信我没有收到信号的原因是因为这些线程问题。

最佳答案

你可以使用 QueuedConnection用于捕获来自不同线程的信号。

connect(this->serial, SIGNAL(readyRead()), 
    this, SLOT(readSerialData()), Qt::QueuedConnection);

这样,一旦控件返回到它的事件循环,槽就应该在主线程的上下文中执行。

此外,this post似乎建议您不应该为 QtSerialPort 设置父级(可能是因为 moveToThread 不适用于具有父级的 QObjects)。

关于c++ - QtSerialPort 在错误的线程中实例化,导致信号/插槽失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15161671/

相关文章:

qt - 是否可以删除 Weston 工具栏?

node.js - 在 node.js 中使用串行端口进行异步/等待

c++ - QTableView 行删除

c++ - Moc'ed 文件神秘地从 Visual Studio 项目中排除

c++ - 从这里实例化的类错误c++

c# - RS232通讯协议(protocol)三菱FX3G PLC

c++ - 为什么我在以受限用户身份运行时会在 DLLMain 中获得 GPF?

c++ - 如何在没有硬件抽象层的情况下直接访问x64硬件?

C++ hexfloat 编译时解析

c++ - 如何获取当前执行的程序集路径