我使用以下代码与USB串口设备通信:
#include "masterthread.h"
#include <QtSerialPort/QSerialPort>
#include <QTime>
#include "Windows.h"
#include "Psapi.h"
#include <QDebug>
QT_USE_NAMESPACE
MasterThread::MasterThread(QObject *parent)
: QThread(parent), waitTimeout(0), quit(false)
{
}
MasterThread::~MasterThread()
{
mutex.lock();
quit = true;
cond.wakeOne();
mutex.unlock();
wait();
}
void MasterThread::run()
{
bool currentPortNameChanged = false;
QSerialPort serial;
serial.setPortName("COM3");
serial.setBaudRate(57600);
serial.setStopBits(static_cast<QSerialPort::StopBits>(1));
serial.setDataBits(static_cast<QSerialPort::DataBits>(8));
serial.setParity(static_cast<QSerialPort::Parity>(0));
serial.open(QIODevice::ReadWrite);
//Tell the serial port connected device to start talking
//--------------------------------------
const char init[] = { 0x0d, 0x0d, 0x0d };
serial.write(init, sizeof(init));
const char* cmd = "mavlink stop\n";
serial.write(cmd, strlen(cmd));
serial.write(init, 2);
cmd = "uorb start";
serial.write(cmd, strlen(cmd));
serial.write(init, 2);
cmd = "sh /etc/init.d/rc.usb\n";
serial.write(cmd, strlen(cmd));
serial.write(init, 4);
serial.waitForBytesWritten(100);
int i = 0;
int j = 0;
forever
{
//Write test data out
//-----------------------------
QByteArray test(2000, 't');
serial.write(test);
bool check = serial.waitForBytesWritten(100);
if (!check)
{
qDebug() << "FAIL: " << j++;
}
if (serial.waitForReadyRead(20))
{
QByteArray responseData = serial.readAll();
while (serial.waitForReadyRead(10))
responseData += serial.readAll();
QString response(responseData);
qDebug() << response;
}
QThread::msleep(20);
//Print memory usage
//---------------------------------------------------
if (i++ % 10 == 0)
{
PROCESS_MEMORY_COUNTERS memcount;
if (!GetProcessMemoryInfo(GetCurrentProcess(), &memcount, sizeof(memcount))) return;
qDebug()<<"----------------------------" << memcount.WorkingSetSize / 1024 << "KB memory used";
}
} // end foever
qDebug() << "Exiting forever loop";
}
使用以下简单的main.cpp文件:
#include <QApplication>
#include "masterthread.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MasterThread thread;
thread.start();
return app.exec();
}
但内存使用量不断增加,每小时增加5~10MB,好像存在一些泄漏。
这个设备应该持续连接数天甚至数周……
我在Qt5.6下运行windows7 debug环境,我做错了什么吗?
QThread::msleep(20);
之前最好调用QCoreApplication::processEvents();
。 - PeterTdeleteLater()
或其他依赖于事件循环的机制,我可以看到它会导致这种行为。我不太了解Qt,无法确定哪些对象依赖于事件循环,哪些不依赖,但如果您有更多经验,请随时分享您的想法。 - PeterTQCoreApplication::processEvents();
,显然的内存泄漏仍然存在? - PeterTQObject
中,forever
部分应该包含在从零超时定时器调用的 slot/functor 中,然后摆脱waitFor
,改用信号/槽连接到QIODevice
信号上。这将导致更清晰、更高效、更声明式的代码。可参考例如 这个答案 或 那个答案。 - Kuba hasn't forgotten MonicaGetProcessMemoryInfo
并不能告诉你很多信息。每小时增加5~10MB可能是由于地址空间碎片化而不是泄漏所致。获取一个调试的Qt构建,并使用它与内存调试器一起使用。 - Kuba hasn't forgotten Monica