2013-06-28 72 views
5

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.

Trả lời

7

Vấn đề rất có thể là bạn serverIt đối tượng nằm ngoài phạm vi trước khi phương thức run được gọi.

Bạn không có quyền kiểm soát khi chuỗi có thể chạy, vì vậy có thể vòng lặp lặp lại trước khi phương thức run của lớp của bạn được gọi, nhưng đối tượng của bạn đã bị hủy và bảng chức năng ảo.

+2

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. –

2
Pool.start() 

bắt đầu chuỗi và trả về. Đó là lý do tại sao trong PDF bạn liên kết ví dụ threadpool của họ trông như thế này:

main() 
    Poco::ThreadPool::defaultPool().start(runnable); 
    Poco::ThreadPool::defaultPool().joinAll(); 
    return 0; 

Khi bạn bước qua nó trong gdb, bạn cho lần thread để làm điều này trước khi biến dụ đi ra khỏi phạm vi.

Các vấn đề liên quan