C++ QtGui5未加载

C++ QtGui5未加载,c++,multithreading,qt,winapi,C++,Multithreading,Qt,Winapi,我正在用C++、winApi和Qt开发一个应用程序。此应用程序的作用是通过串行COM端口进行通信。 用户可以打开多对端口,打开的端口会不断侦听其他端口。 为了实现这个功能,我使用windows线程。有一个名为startRead()的方法,它不断地从其他端口读取并更改文本区域 void SendAndReceive::startRead(){ DWORD numRead = 0; std::string hex; while (1) { char

我正在用
C++
winApi
Qt
开发一个应用程序。此应用程序的作用是通过串行COM端口进行通信。 用户可以打开多对端口,打开的端口会不断侦听其他端口。 为了实现这个功能,我使用windows线程。有一个名为
startRead()
的方法,它不断地从其他端口读取并更改文本区域

void SendAndReceive::startRead(){

    DWORD numRead = 0;
    std::string hex;

    while (1)
    {
        char *buffer = (char *)malloc(sizeof(char) * 500);
        BOOL ret = ReadFile(portHandler, buffer, 500, &numRead, 0);
        if (!ret)
        {
            std::string errorMessage = "";
        }
        buffer[numRead] = '\0';
        std::string receivedData(buffer);
        QString QData(receivedData.c_str());
        if (ui->checkBox->isChecked())
        {
            std::string receivedData(buffer);
            hex= stringToHex(receivedData);
            QString QData1(hex.c_str());
            emit asHex(QData1);
        }

        QString QData2(receivedData.c_str()) ;
        emit finished(QData2);
        free(buffer);
    }
}
还有另一个线程定期将数据写入其他端口。例如,如果在文本行中输入2秒,程序将每隔2秒向其他端口写入数据,此方法为
writePeriodic()

所以当我运行这个程序时,程序平稳运行了2到3分钟,然后崩溃了,我得到了错误,比如“程序停止工作”,“程序意外关闭”。当我调试程序时,它会说“Qt5Core未加载”或“Qt5Gui未加载”


在我提问之前,我在网上做了一些搜索。首先,我没有使用
emit finished(QString)
signal,而是在
startrade()
方法中直接操作GUI对象。(我做了类似
ui->text\u edit->setText(一些QString)
).但经过一番搜索后,我发现我无法从另一个线程更改GUI对象,因此我决定使用信号和插槽机制,但到目前为止还没有解决我的问题。我一次又一次地遇到相同的错误。请告诉我我做错了什么。如果您需要进一步解释,我很乐意提供更多详细信息。

寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现此问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建。在QtCreator中,应用程序输出表示QObject::connect:无法对“QTextBlock”类型的参数进行排队(确保使用qRegisterMetaType()注册了“QTextBlock”)。QObject::connect:无法对“QTextCursor”类型的参数进行排队(确保使用qRegisterMetaType()注册了“QTextCursor”)QObject::connect:无法对类型为“QTextBlock”的参数进行排队(确保使用qRegisterMetaType()注册了“QTextBlock”)。QObject::connect:无法对类型为“QTextCursor”的参数进行排队,即使我没有使用QTextCursor。Qt必须遵守基础窗口系统的规则。在Windows中,您不能从所属线程以外的任何线程操作窗口。从创建窗口小部件的线程以外的其他线程操作窗口小部件本质上是相同的。别这么做,反正我也不这么做。起初我是这样做的,但后来我使用了信号和插槽机制。你的意思是我甚至不能执行“ui->textEdit->toPlainText();”?@Rames:将Qt与windowsapi混合使用是安全的,这不是一个坏主意。
void SendAndReceive::writePeriodic(){
    DWORD numWritten;
    while (1 && checkWrite == true )
    {
        Concurrency::wait(timePeriod*1000);
        QString QData = ui->textEdit->toPlainText();
        std::string data = QData.toStdString();
        WriteFile(portHandler, data.c_str(), strlen(data.c_str()), &numWritten, NULL);
    }
}