From f8b6233e0fb5ab9126532ce7c24361c91c8c6c52 Mon Sep 17 00:00:00 2001 From: JBTing Date: Sun, 25 Jun 2023 20:20:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E9=80=81=E7=BC=93=E5=86=B2=E4=B9=9F?= =?UTF-8?q?=E9=87=87=E5=8F=96=E9=9D=99=E6=80=81=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taskbusplatform/core/tasknode.cpp | 44 ++++++++++++++----------------- taskbusplatform/core/tasknode.h | 6 +++-- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/taskbusplatform/core/tasknode.cpp b/taskbusplatform/core/tasknode.cpp index 1314787..2a8ae5b 100644 --- a/taskbusplatform/core/tasknode.cpp +++ b/taskbusplatform/core/tasknode.cpp @@ -178,20 +178,20 @@ void taskNode::slot_readyReadStandardOutput() { //QByteArray arred = m_process->readAllStandardOutput(); //Size reuse - const qsizetype tailsize = m_array_stdout.size()-m_currsize; + const qsizetype tailsize = m_array_stdout.size()-m_readBufMax; if (tailsize < total_sz) { - m_array_stdout.resize(m_currsize + total_sz); + m_array_stdout.resize(m_readBufMax + total_sz); } - total_sz = m_process->read(m_array_stdout.data()+m_currsize,total_sz); - m_currsize += total_sz; + total_sz = m_process->read(m_array_stdout.data()+m_readBufMax,total_sz); + m_readBufMax += total_sz; extern QAtomicInt g_totalrev; g_totalrev += total_sz; qsizetype startByte = 0; char * pBufStart = m_array_stdout.data(); - while (static_cast(sizeof(TASKBUS::subject_package_header)) + startByte < m_currsize) + while (static_cast(sizeof(TASKBUS::subject_package_header)) + startByte < m_readBufMax) { auto * header = reinterpret_cast @@ -205,7 +205,7 @@ void taskNode::slot_readyReadStandardOutput() } else { - if (m_currsize >= + if (m_readBufMax >= startByte + sizeof(TASKBUS::subject_package_header)+header->data_length) { ++m_spackage_sent; @@ -245,10 +245,10 @@ void taskNode::slot_readyReadStandardOutput() } } //Move tail - const int taiBytes = m_currsize - startByte; + const int taiBytes = m_readBufMax - startByte; if (taiBytes) memmove(pBufStart,pBufStart+startByte,taiBytes); - m_currsize = taiBytes; + m_readBufMax = taiBytes; total_sz = m_process->size(); } @@ -374,9 +374,13 @@ void taskNode::slot_readyReadStandardError() bool taskNode::enqueue_write(const char * pack, qsizetype sz) { m_mtxPackage.lock(); - int z = m_queue.size(); - m_queue.push_back(QByteArray(pack,sz)); + qsizetype z = m_writeBufMax; + if(m_writeBufMax + sz > m_array_stdin.size()) + m_array_stdin.resize(m_writeBufMax + sz); + memcpy(m_array_stdin.data()+m_writeBufMax,pack,sz); + m_writeBufMax += sz; m_mtxPackage.unlock(); + ++m_spackage_recieved; if (!z) emit sig_new_package(); return true; @@ -384,21 +388,13 @@ bool taskNode::enqueue_write(const char * pack, qsizetype sz) void taskNode::slot_write() { m_mtxPackage.lock(); - QByteArrayList arr_task = m_queue; - m_queue.clear(); + if (m_bDebug) + log_package(false,m_array_stdin.data(),m_writeBufMax); + m_sbytes_recieved += m_array_stdin.size(); + if (m_process->state()==QProcess::Running) + m_process->write(m_array_stdin.constData(),m_writeBufMax); + m_writeBufMax = 0; m_mtxPackage.unlock(); - for (auto p=arr_task.begin();p!=arr_task.end();++p) - { - if (m_bDebug) - log_package(false,p->data(),p->size()); - ++m_spackage_recieved; - m_sbytes_recieved += p->size(); - if (m_process->state()==QProcess::Running) - { - m_process->write(*p); - } - } - } bool taskNode::cmd_sendcmd(QMap cmd, QSet destins) { diff --git a/taskbusplatform/core/tasknode.h b/taskbusplatform/core/tasknode.h index 4e29211..3499263 100644 --- a/taskbusplatform/core/tasknode.h +++ b/taskbusplatform/core/tasknode.h @@ -60,7 +60,7 @@ private: taskProject * m_currPrj = nullptr; //进程缓存 QByteArray m_array_stdout; - qsizetype m_currsize = 0; + qsizetype m_readBufMax = 0; QByteArrayList m_arr_Strerr; QByteArrayList m_packBuf; bool m_bDebug = false; @@ -72,8 +72,10 @@ private: QFile m_dbgfile_stdout; QFile m_dbgfile_stderr; QString m_uuid; + //发送队列 QMutex m_mtxPackage; - QList m_queue; + QByteArray m_array_stdin; + qsizetype m_writeBufMax = 0; QString dbgdir(); //Call these functions to emit message and packs with bufferring approach. void emit_message(QByteArray a); -- GitLab