Передача данных между потоками POCO C++ Libraries

671
06 января 2017, 10:32

Использую TCPServer (POCO C++ Libraries), который создает поток на 1 клиента. Необходимо передавать клиенту(потоку), к примеру, данные о передвижении персонажей в игровом мире. Как это реализовать?

Answer 1

Для передачи между потоками в POCO существует класс NotificationQueue. Я добавил вывод информационных сообщений в пример отсюда и перевел комментарии:

#include <iostream>
#include <string>
#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 WorkNotification: public Notification
    {
    public:
        WorkNotification(int data): _data(data) {}
        int data() const
            {
            return _data;
            }
    private:
        int _data;
    };
class Worker: public Runnable
    {
    public:
        Worker(NotificationQueue& queue,
            const std::string& str): _queue(queue),name(str) {}
        void run()
            {
            AutoPtr<Notification> pNf(_queue.waitDequeueNotification());
            while (pNf)
                {
                WorkNotification* pWorkNf =
                    dynamic_cast<WorkNotification*>(pNf.get());
                if (pWorkNf)
                    {
                    std::cout<<name<<" get data : "<<pWorkNf->data()<<"\n";
                    }
                pNf = 
                    _queue.waitDequeueNotification();
                }
            }
    private:
        NotificationQueue& _queue;
        std::string name;
    };
int main()
    {
    NotificationQueue queue;
    //создаем рабочие процессы
    Worker worker1(queue,"first"); 
    Worker worker2(queue,"second");
    // запускаем
    ThreadPool::defaultPool().start(worker1); 
    ThreadPool::defaultPool().start(worker2);
    // добавляем уведомления
    for (int i = 0; i < 10; ++i)
        queue.enqueueNotification(new WorkNotification(i));
    while (!queue.empty()) // ждем пока работы выполняются
        Poco::Thread::sleep(100);
    queue.wakeUpAll(); // говорим рабочим о выполнении
    ThreadPool::defaultPool().joinAll();
    return 0;
    }
READ ALSO
Не собирается шаблонный проект CUDA 8.0 в VS15

Не собирается шаблонный проект CUDA 8.0 в VS15

Доброго времени суток! Порядок моих действий:

360
Проблема с созданием аналога SetLength на C++

Проблема с созданием аналога SetLength на C++

Пытаюсь сделать аналог SetLength (паскаль) в C++ Просто уже нет сил без такой же удобной вещи, но мой код почему-то не работает Вот код:

373
оздал TEdit динамически, не могу в него ничего писать в программе, даже выделить не могу

оздал TEdit динамически, не могу в него ничего писать в программе, даже выделить не могу

Создал TEdit динамически, не могу в него ничего писать в программе, даже выделить не могу

387
Размещения без повторений,c++

Размещения без повторений,c++

Есть код размещений с повторениями,не могу понять реализацию алгоритма без повторений,везде нахожу что нужна функция аля"NextSet",которая бы как...

362