From 5159e200a1c4c0998f302ae7c57325ed322c1e85 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Wed, 6 Aug 2008 22:51:26 +0200 Subject: [PATCH] Enable plain old QTimer-based asynchronous message processing. More fancy stuff will follow later ;-) --- src/client/abstractmessageprocessor.cpp | 10 +------ src/client/abstractmessageprocessor.h | 7 +++-- src/qtui/qtuimessageprocessor.cpp | 36 ++++++++++++++++++++----- src/qtui/qtuimessageprocessor.h | 24 ++++++++++++++--- 4 files changed, 54 insertions(+), 23 deletions(-) diff --git a/src/client/abstractmessageprocessor.cpp b/src/client/abstractmessageprocessor.cpp index 5ba8683f..0f692af8 100644 --- a/src/client/abstractmessageprocessor.cpp +++ b/src/client/abstractmessageprocessor.cpp @@ -28,14 +28,6 @@ AbstractMessageProcessor::AbstractMessageProcessor(QObject *parent) : QObject(pa } -void AbstractMessageProcessor::process(Message &msg) { - processMessage(msg); +void AbstractMessageProcessor::postProcess(Message &msg) { Client::buffer(msg.bufferInfo())->updateActivityLevel(msg); } - -void AbstractMessageProcessor::process(QList &msgs) { - processMessages(msgs); - foreach(Message msg, msgs) { - Client::buffer(msg.bufferInfo())->updateActivityLevel(msg); - } -} diff --git a/src/client/abstractmessageprocessor.h b/src/client/abstractmessageprocessor.h index b140ac19..f02728cb 100644 --- a/src/client/abstractmessageprocessor.h +++ b/src/client/abstractmessageprocessor.h @@ -30,14 +30,13 @@ class AbstractMessageProcessor : public QObject { AbstractMessageProcessor(QObject *parent); public slots: - void process(Message &msg); - void process(QList &msgs); + virtual void process(Message &msg) = 0; + virtual void process(QList &msgs) = 0; signals: protected: - virtual void processMessage(Message &msg) = 0; - virtual void processMessages(QList &msgs) = 0; + void postProcess(Message &msg); }; diff --git a/src/qtui/qtuimessageprocessor.cpp b/src/qtui/qtuimessageprocessor.cpp index 54ee5702..203397de 100644 --- a/src/qtui/qtuimessageprocessor.cpp +++ b/src/qtui/qtuimessageprocessor.cpp @@ -27,20 +27,42 @@ #include "network.h" QtUiMessageProcessor::QtUiMessageProcessor(QObject *parent) : AbstractMessageProcessor(parent) { - - + _processing = false; + _processMode = TimerBased; + _processTimer.setInterval(0); + connect(&_processTimer, SIGNAL(timeout()), this, SLOT(processNextMessage())); } -void QtUiMessageProcessor::processMessage(Message &msg) { +void QtUiMessageProcessor::process(Message &msg) { checkForHighlight(msg); Client::messageModel()->insertMessage(msg); + postProcess(msg); +} + +void QtUiMessageProcessor::process(QList &msgs) { + _processQueue.append(msgs); + if(!isProcessing()) startProcessing(); } -void QtUiMessageProcessor::processMessages(QList &msgs) { - foreach(Message msg, msgs) { - checkForHighlight(msg); - Client::messageModel()->insertMessage(msg); +void QtUiMessageProcessor::startProcessing() { + if(processMode() == TimerBased) { + if(_currentBatch.isEmpty() && _processQueue.isEmpty()) return; + _processing = true; + if(!_processTimer.isActive()) _processTimer.start(); + } +} + +void QtUiMessageProcessor::processNextMessage() { + if(_currentBatch.isEmpty()) { + if(_processQueue.isEmpty()) { + _processTimer.stop(); + _processing = false; + return; + } + _currentBatch = _processQueue.takeFirst(); } + Message msg = _currentBatch.takeFirst(); + process(msg); } // TODO optimize checkForHighlight diff --git a/src/qtui/qtuimessageprocessor.h b/src/qtui/qtuimessageprocessor.h index 161385b0..cfbc1394 100644 --- a/src/qtui/qtuimessageprocessor.h +++ b/src/qtui/qtuimessageprocessor.h @@ -21,21 +21,39 @@ #ifndef QTUIMESSAGEPROCESSOR_H_ #define QTUIMESSAGEPROCESSOR_H_ +#include + #include "abstractmessageprocessor.h" class QtUiMessageProcessor : public AbstractMessageProcessor { Q_OBJECT public: + enum Mode { + TimerBased, + Concurrent + }; + QtUiMessageProcessor(QObject *parent); + inline bool isProcessing() const { return _processing; } + inline Mode processMode() const { return _processMode; } + public slots: + void process(Message &msg); + void process(QList &msgs); - private: - void processMessage(Message &msg); - void processMessages(QList &msgs); + private slots: + void processNextMessage(); + private: void checkForHighlight(Message &msg); + void startProcessing(); + QList > _processQueue; + QList _currentBatch; + QTimer _processTimer; + bool _processing; + Mode _processMode; }; #endif -- 2.20.1