代码之家  ›  专栏  ›  技术社区  ›  waas1919

C++ POCO——如何在线程池上启动线程而不使用Run()方法?

  •  2
  • waas1919  · 技术社区  · 6 年前

    C++ POCO库的实现方法 documentation 演示如何启动 thread thread-pool 是这样的:

    #include "Poco/ThreadPool.h"
    #include "Poco/Runnable.h"
    #include <iostream>
    #include <thread>
    
    class Foo : public Poco::Runnable
    {
    public:
        virtual void run()
        {
            while (true)
            {
                std::cout << "Hello Foo " << std::endl;
                std::this_thread::sleep_for(std::chrono::milliseconds(1000));
            }
        }
    };
    
    int main(int argc, char** argv)
    {
        Foo foo;
        Poco::ThreadPool::defaultPool().addCapacity(16);
        Poco::ThreadPool::defaultPool().startWithPriority(Poco::Thread::Priority::PRIO_LOW, foo);
        Poco::ThreadPool::defaultPool().joinAll();
        return 0;
    }
    

    效果很好。

    不过,现在我想用同样的方法 class Foo ,然后启动另一个 线 (使用相同的 )从虚拟方法之外的另一种方法 run() .

    类似于以下伪代码:

        #include "Poco/ThreadPool.h"
        #include "Poco/Runnable.h"
        #include <iostream>
        #include <thread>
    
        class Foo : public Poco::Runnable
        {
        public:
            virtual void run()
            {
                // ERROR: How can I launch this thread on the method anotherThread()?
                Poco::ThreadPool::defaultPool().startWithPriority(Poco::Thread::Priority::PRIO_LOW, anotherThread);
    
                while (true)
                {
                    std::cout << "Hello Foo " << std::endl;
                    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
                }
            }
    
            void anotherThread() // This is the new thread!!
            {
                while (true)
                {
                    std::cout << "Hello anotherThread " << std::endl;
                    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
                }
            }
        };
    
        int main(int argc, char** argv)
        {
            Foo foo;
            Poco::ThreadPool::defaultPool().addCapacity(16);
            Poco::ThreadPool::defaultPool().startWithPriority(Poco::Thread::Priority::PRIO_LOW, foo);
            Poco::ThreadPool::defaultPool().joinAll();
            return 0;
        }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   waas1919    6 年前

    我很高兴与大家分享答案。

    解决方案是使用 Poco::RunnableAdapter 班级。

    如果其他人发现同样的问题:

    #include <Poco/Runnable.h>
    #include <Poco/Thread.h>
    #include <Poco/ThreadPool.h>
    #include <Poco/ThreadTarget.h>
    #include <Poco/RunnableAdapter.h>
    
    #include <string>
    #include <iostream>
    
    class Foo : public Poco::Runnable
    {
    public:
        virtual void run()
        {
            std::cout << "  run() start" << std::endl;
            Poco::Thread::sleep(200);
            std::cout << "  run() end" << std::endl;
        }
    
        void anotherThread()
        {
            std::cout << "  anotherThread() start" << std::endl;
            Poco::Thread::sleep(200);
            std::cout << "  anotherThread() end" << std::endl;
        }
    };
    
    int main()
    {
        Poco::ThreadPool::defaultPool().addCapacity(16);
    
        Foo foo;
        Poco::RunnableAdapter<Foo> bar(foo, &Foo::anotherThread);
    
        Poco::ThreadPool::defaultPool().startWithPriority(Poco::Thread::Priority::PRIO_LOW, foo);
        Poco::ThreadPool::defaultPool().startWithPriority(Poco::Thread::Priority::PRIO_LOW, bar);
    
        Poco::ThreadPool::defaultPool().joinAll();
    
        return 0;
    }