У меня есть этот код ниже.
У меня есть две разные темы: 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
уже нет способа сделать это автоматически? Как сказать, что уведомление ТОЛЬКО для этого конкретного потока?