Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 停止用于单元测试的Poco::线程 问题_C++_Unit Testing_Poco Libraries - Fatal编程技术网

C++ 停止用于单元测试的Poco::线程 问题

C++ 停止用于单元测试的Poco::线程 问题,c++,unit-testing,poco-libraries,C++,Unit Testing,Poco Libraries,我有一个UDPlistener应用程序,需要为其编写单元测试。此侦听器在端口上持续侦听,并始终在产品上运行。我们将poco库用于标准库以外的框架 现在我需要将它添加到单元测试应用程序中 电流溶液 我认为在运行应用程序的类RunApp中实现Poco::Runnable最简单。然后,我可以在单元测试中创建一个新的Poco::Thread,以运行RunApp类 这是有效的;我的侦听器正在运行,我可以在生成线程后在单元测试体中发送测试消息。但是,我需要停止侦听器,以便其他单元测试可以运行。我添加了一条U

我有一个UDPlistener应用程序,需要为其编写单元测试。此侦听器在端口上持续侦听,并始终在产品上运行。我们将poco库用于标准库以外的框架

现在我需要将它添加到单元测试应用程序中

电流溶液 我认为在运行应用程序的类
RunApp
中实现
Poco::Runnable
最简单。然后,我可以在单元测试中创建一个新的
Poco::Thread
,以运行
RunApp

这是有效的;我的侦听器正在运行,我可以在生成线程后在单元测试体中发送测试消息。但是,我需要停止侦听器,以便其他单元测试可以运行。我添加了一条UDP消息,告诉侦听器自杀,但这只用于单元测试和潜在的安全问题

问题:
有没有办法强制停止
Poco::Thread
?还是我构造了这个单元测试错了?我不希望侦听器在所有其他单元测试期间运行。

如果不使用
Poco::Thread
而使用
Poco::Task
,则会得到一个可以取消的线程。下面的示例代码(准备按原样运行)应该会让您有所了解:

#include <Poco/Task.h>
#include <Poco/TaskManager.h>
#include <Poco/Thread.h>

#include <string>
#include <iostream>
using namespace std;

class UdpListenerTask : public Poco::Task {
public:
    UdpListenerTask(const string& name) : Task(name) { }

    void runTask() {
        cout << name() << ": starting" << endl;
        while (! isCancelled()) {
            // Do some work. Cannot block indefinitely, otherwise it
            // will never test the isCancelled() condition.
            doSomeWork();
        }
        cout << endl << name() << ": cancelled " << endl;
    }
private:
    int doSomeWork() {
        cout << "*" << flush;
        // Simulate some time spent doing work
        int i;
        for (i = 0; i < INT32_MAX/1000; i++) { }
        return i;
    }
};

void runUdpProbe() {
    // Simulate some time spent running the probe.
    Poco::Thread::sleep(1000);
}

int main() {
    Poco::TaskManager tm;
    UdpListenerTask* st = new UdpListenerTask("task1");
    tm.start(st); // tm takes ownership

    // Run test 1.
    runUdpProbe();
    // Test 1 done. Cancel the UDP listener
    st->cancel();

    // Run all the other tests

    // cleanup
    tm.joinAll();
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
类UdpListenerTask:公共Poco::Task{
公众:
UdpListenerTask(常量字符串和名称):任务(名称){}
void runTask(){
库特