我正在C++
,winApi
和Qt
开发一个应用程序。该应用程序的作用是通过串行COM端口进行通信。
用户可以打开多对端口,打开的端口可以不断地侦听其他端口。
为了实现这个功能,我使用了windows threads.There方法名为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()
。
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);
}
}
因此,当我运行这个程序时,程序运行平稳2或3分钟然后它崩溃,我得到错误,如“程序已停止工作”,“程序意外关闭”。当我调试程序时,它说“像” Qt5Core未加载“或”Qt5Gui未加载“。
在我问这里之前,我在网上做了一些搜索。首先我没有使用emit finished(QString)
信号,而是直接操作startRead()
方法中的GUI对象。(我做了ui->text_edit->setText(some QString)
之类的事情。)但经过一些搜索后我才知道我无法更改GUI来自另一个线程的对象,所以我决定使用信号和插槽机制,到目前为止它还没有解决我的问题。我一次又一次地得到同样的错误。请告诉我我做错了什么。如果您需要进一步解释,我很乐意提供更多细节。