diff --git a/taskbusplatform/core/tasknode.cpp b/taskbusplatform/core/tasknode.cpp index 060617c91c7011115bb76b516e42128cfdfb2eab..ff312db78bb4c6f8df9aa554c0ff7ddc441d24bc 100644 --- a/taskbusplatform/core/tasknode.cpp +++ b/taskbusplatform/core/tasknode.cpp @@ -39,8 +39,9 @@ taskNode::taskNode(QObject *parent) connect(m_process,&QProcess::bytesWritten,this, &taskNode::slot_sended); connect(this,&taskNode::private_sig_nextcab,this, - &taskNode::slot_readyReadStandardOutput,Qt::QueuedConnection); - m_nBp_TimerID = startTimer(200); + &taskNode::slot_readyReadStandardOutput,Qt::QueuedConnection); + connect(this,&taskNode::sig_new_package,this,&taskNode::slot_write,Qt::QueuedConnection); + m_nBp_TimerID = startTimer(200); } taskNode::~taskNode() { @@ -356,19 +357,46 @@ void taskNode::slot_readyReadStandardError() } bool taskNode::enqueue_write(QByteArray arr) { - m_mtxPackage.lock(); - if (m_bDebug) - log_package(false,arr); - if (m_process->state()==QProcess::Running) - { - m_process->write(arr); - ++m_spackage_recieved; - m_sbytes_recieved += arr.size(); - } - m_mtxPackage.unlock(); +#ifdef WIN32 + m_mtxPackage.lock(); + if (m_bDebug) + log_package(false,arr); + if (m_process->state()==QProcess::Running) + { + m_process->write(arr); + ++m_spackage_recieved; + m_sbytes_recieved += arr.size(); + } + m_mtxPackage.unlock(); +#else + m_mtxPackage.lock(); + int z = m_queue.size(); + m_queue.push_back(arr); + m_mtxPackage.unlock(); + if (!z) + emit sig_new_package(); +#endif return true; } +void taskNode::slot_write() +{ + m_mtxPackage.lock(); + QByteArrayList arr_task = m_queue; + m_queue.clear(); + m_mtxPackage.unlock(); + for (auto p=arr_task.begin();p!=arr_task.end();++p) + { + if (m_bDebug) + log_package(false,*p); + ++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) { if (destins.contains(m_uuid)==false diff --git a/taskbusplatform/core/tasknode.h b/taskbusplatform/core/tasknode.h index f2ae0990e74ce60e7299eeea37f77ec23f43032b..557865db8d9c6b81c8b6ec3b7b384ee5affbfac5 100644 --- a/taskbusplatform/core/tasknode.h +++ b/taskbusplatform/core/tasknode.h @@ -24,7 +24,7 @@ class taskProject; /*! * \brief The taskNode class 管理一个构件进程的类 * 这个类包含基本的进程启动终止、管道维护 - * A class that manages a component process. This class contains basic process + * A clapush_backss that manages a component process. This class contains basic process * start-up termination, pipeline maintenance */ class taskNode : public QObject @@ -38,6 +38,7 @@ signals: void sig_pro_started(); void sig_pro_stopped(int exitCode, QProcess::ExitStatus exitStatus); void sig_new_command(QMap cmd); + void sig_new_package(); void sig_new_errmsg(QByteArrayList); void sig_iostat(qint64 pid,quint64 pr,quint64 ps,quint64 br, quint64 bs); void private_sig_nextcab(); @@ -51,6 +52,7 @@ private slots: void slot_readyReadStandardOutput(); void slot_readyReadStandardError(); void slot_sended(qint64 ); + void slot_write(); void slot_started( ); void slot_stopped(); private: @@ -69,7 +71,8 @@ private: QFile m_dbgfile_stdout; QFile m_dbgfile_stderr; QString m_uuid; - QMutex m_mtxPackage; + QMutex m_mtxPackage; + QList m_queue; QString dbgdir(); //Call these functions to emit message and packs with bufferring approach. void emit_message(QByteArray a);