C ++ Poco - Как отправить уведомление / сообщение определенной теме? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть этот код ниже.

У меня есть две разные темы: Foo и Bar. На main() я хочу отправить сообщение в ветку Foo. Для этого я использую библиотеки NotificationQueue из POCO.

#include <iostream>
#include "Poco/Notification.h"
#include "Poco/NotificationQueue.h"
#include "Poco/ThreadPool.h"
#include "Poco/Runnable.h"
#include "Poco/AutoPtr.h"

using Poco::Notification;
using Poco::NotificationQueue;
using Poco::ThreadPool;
using Poco::Runnable;
using Poco::AutoPtr;

class Message : public Notification
{
public:
    Message(std::string msg) 
        : mMsg(msg) 
    {
    }

    std::string getMsg() const
    {
        return mMsg;
    }
private:
    std::string mMsg;
};

class Foo: public Runnable
{
public:
    Foo(NotificationQueue& queue) : mQueue(queue) {}

    void run()
    {
        AutoPtr<Notification> notification(mQueue.waitDequeueNotification());
        while (notification)
        {
            Message* msg = dynamic_cast<Message*>(notification.get());

            if (msg)
            {
                std::cout << "received from Foo: " << msg->getMsg() << std::endl;
            }
            notification = mQueue.waitDequeueNotification();
        }
    }
private:
    NotificationQueue & mQueue;
};

class Bar: public Runnable
{
public:
    Bar(NotificationQueue& queue) : mQueue(queue) {}

    void run()
    {
        AutoPtr<Notification> notification(mQueue.waitDequeueNotification());
        while (notification)
        {
            Message* msg = dynamic_cast<Message*>(notification.get());

            if (msg)
            {
                std::cout << "received from Bar: " << msg->getMsg() << std::endl;
            }
            notification = mQueue.waitDequeueNotification();
        }
    }
private:
    NotificationQueue & mQueue;
};

int main(int argc, char** argv)
{
    NotificationQueue queue;

    Foo foo(queue);
    Bar bar(queue);

    ThreadPool::defaultPool().start(foo);
    ThreadPool::defaultPool().start(bar);

    queue.enqueueNotification(new Message(std::string("start"))); //I want to send this message to Foo!!!

    while (!queue.empty())
    {
        Poco::Thread::sleep(100);
    }

    queue.wakeUpAll();

    ThreadPool::defaultPool().joinAll();

    return 0;
}

Я запускал свой код несколько раз, и я вижу, что иногда поток Foo сначала ловит сообщение, но иногда это поток Bar.

Вывод после запуска 5 раз:

received from Foo: start
received from Foo: start
received from Bar: start
received from Bar: start
received from Foo: start

Я знаю, что могу создать source и destination на message class, используя фильтр. Но это приносит мне два вопроса:

1 - Если мне нужно создать собственную фильтрацию сообщений, как я могу просто просмотреть сообщение, не удаляя его из очереди? Например: Thread A необходимо отправить сообщение на Thread B, но Thread C сначала его перехватит. Так что Thread C нужно только посмотреть адресат ... если он не для них, то не удаляет сообщение из очереди.

2 - Разве на POCO уже нет способа сделать это автоматически? Как сказать, что уведомление ТОЛЬКО для этого конкретного потока?

...