Tôi đang sử dụng libPoco để tạo máy chủ giả để kiểm tra một số mã máy khách.Chức năng ảo thuần túy được gọi là
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
là lớp trừu tượng và tôi khá chắc chắn rằng chạy là một hàm ảo thuần túy. Pool.start(serveIt)
dường như đang gọi số run
của ServerRunnable
. Khi tôi chạy nó từ bàn điều khiển, tôi liên tục gặp lỗi pure virtual method called
. Tuy nhiên, nếu tôi đang trong gdb bước qua mã sau đó tôi sẽ thành công chấp nhận kết nối từ khách hàng và gửi cho họ dữ liệu. không phải là một chức năng ảo thuần túy và đó là những gì nên được gọi.
ví dụ Mã cho Threading libPoco đều trong http://pocoproject.org/slides/130-Threads.pdf
Tôi cũng đang nghĩ rằng tôi có thể gọi phương thức ảo thuần túy trong các nhà xây dựng, nhưng không có gì là trong contructor và tôi chỉ sử dụng các destuctor mặc định. Có cách nào đó để móng tay xuống đâu và chức năng ảo tinh khiết nào đang được gọi? Trong gdb? Cảm ơn.
Tôi đồng ý rằng đó có thể là những gì đang xảy ra. Tình huống chung gây ra một chức năng ảo thuần túy được gọi là hàm ảo được gọi ra trước khi constructor hoàn thành hoặc sau khi destructor bắt đầu. –