有沒有哪位兄弟遇見過QT串口發送時耗記憶體的情況?我用QT5.11自帶串口事例blockingmaster同樣存在這個問題,時間越長消耗記憶體越大
大約一個小時需要消耗1M記憶體,代碼如下,并且write的時候在windows下系統剪切板不能使用了
//! [4]
void MasterThread::run()
{
bool currentPortNameChanged = false;
m_mutex.lock();
//! [4] //! [5]
QString currentPortName;
if (currentPortName != m_portName) {
currentPortName = m_portName;
currentPortNameChanged = true;
}
int currentWaitTimeout = m_waitTimeout;
QString currentRequest = m_request;
m_mutex.unlock();
//! [5] //! [6]
QSerialPort serial;
if (currentPortName.isEmpty()) {
emit error(tr("No port name specified"));
return;
}
if (currentPortNameChanged) {
serial.close();
serial.setPortName(currentPortName);
if (!serial.open(QIODevice::ReadWrite)) {
emit error(tr("Can't open %1, error code %2")
.arg(m_portName).arg(serial.error()));
return;
}
}
//while (!m_quit) {
while (true) {
//![6] //! [7]
//! [7] //! [8]
// write request
const QByteArray requestData = currentRequest.toUtf8();
serial.write(requestData);
if (serial.waitForBytesWritten(m_waitTimeout)) {
//! [8] //! [10]
// read response
if (serial.waitForReadyRead(currentWaitTimeout)) {
QByteArray responseData = serial.readAll();
while (serial.waitForReadyRead(10))
responseData += serial.readAll();
const QString response = QString::fromUtf8(responseData);
//! [12]
emit this->response(response);
//! [10] //! [11] //! [12]
} else {
emit timeout(tr("Wait read response timeout %1")
.arg(QTime::currentTime().toString()));
}
//! [9] //! [11]
} else {
emit timeout(tr("Wait write request timeout %1")
.arg(QTime::currentTime().toString()));
}
//! [9] //! [13]
/* m_mutex.lock();
m_cond.wait(&m_mutex);
if (currentPortName != m_portName) {
currentPortName = m_portName;
currentPortNameChanged = true;
} else {
currentPortNameChanged = false;
}
currentWaitTimeout = m_waitTimeout;
currentRequest = m_request;
m_mutex.unlock();*/
}
//! [13]
}
uj5u.com熱心網友回復:
都沒遇見過嗎?uj5u.com熱心網友回復:
沒遇到過,樓主自己的問題吧,不過串口的執行緒想寫好不容易。uj5u.com熱心網友回復:
是qt自帶的執行緒,把打開串口放到了while外面而已uj5u.com熱心網友回復:
windows 1小時1M?,是持續性的嗎,比如掛機1星期,記憶體增加160多M這樣的嗎?如果只是增加1M或幾M后穩定下來,那應該是window的快取機制引起的。可以在執行緒中分配一塊用來接收資料的記憶體,自己維護,回圈使用。避免頻繁分配-釋放記憶體的操作。uj5u.com熱心網友回復:
記憶體一直增加,可以達到幾百Muj5u.com熱心網友回復:
貼原始碼吧,或者發完整原始碼下載地址,你這樣子,沒人能幫得了你。QT串口有坑的,不是說它有bug,而是說它容易出錯。
可以換CSerialPort試試。
或者你不要這樣寫QT串口程式,最好還是用異步信號槽的方式。
QT官方例子有毒的。
uj5u.com熱心網友回復:
好像Windows使用waitforreadyred這個介面會有未知問題,使用異步信號槽吧轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/130733.html
標籤:Qt
上一篇:微信定位有辦法破解嗎
