我正在使用libPoco创建一个虚拟服务器来测试一些客户端代码。
class ServerRunnable: public Poco::Runnable {
public:
ServerRunnable(StreamSocket conn) : conn(conn) {
}
void run(){
string mess("Can you hear me?\n");
try{
this->conn.sendBytes(mess.c_str(), mess.size());
} catch (Poco::Exception& ex){
cerr << ex.displayText() << endl;
return;
}
cerr << "The message has been sent." << endl;
}
void setConn(StreamSocket inConn){
this->conn = inConn;
}
private:
StreamSocket conn;
};
int main(int argc, char **argv){
ServerSocket s;
try{
s.bind(8083, true);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
exit(1);
}
s.listen(124);
Poco::ThreadPool Pool(10, 25, 60, 128);
while(1){
try{
StreamSocket conn = s.acceptConnection();
ServerRunnable serveIt(conn);
Pool.start(serveIt);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
Pool.joinAll();
exit(1);
}
}
return 0;
}
Poco::Runnable
是一个抽象类,我很确定run是一个纯虚函数。 Pool.start(serveIt)
似乎在调用ServerRunnable
的{{1}}。当我从控制台运行它时,我始终遇到run
错误。但是,如果我在gdb中逐步执行代码,那么我将成功接受来自客户端的连接并向其发送数据。 pure virtual method called
的{{1}}不是纯虚函数,应该调用它。
libPoco线程的代码示例位于http://pocoproject.org/slides/130-Threads.pdf
我也在想我可能在构造函数中调用纯虚方法,但是在构造函数中没有任何东西,我只是使用默认的destuctor。是否有某种方法可以确定调用哪些纯虚函数?在gdb?谢谢。
答案 0 :(得分:7)
问题很可能是serverIt
对象在调用run
方法之前超出范围。
您无法控制线程何时可以运行,因此可能是在调用类的run
方法之前循环迭代,但是您的对象已被销毁,并且它当然破坏了虚函数表。
答案 1 :(得分:2)
Pool.start()
启动一个线程并返回。这就是为什么在你链接他们的线程池示例的PDF中看起来像这样:
main()
Poco::ThreadPool::defaultPool().start(runnable);
Poco::ThreadPool::defaultPool().joinAll();
return 0;
当你在gdb中逐步执行它时,你会让线程有时间在实例变量超出范围之前做它的事情。