4

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は抽象クラスであり、実行は純粋な仮想関数であると確信しています。Pool.start(serveIt)を呼び出しているようServerRunnableですrun。コンソールから実行すると、一貫してpure virtual method calledエラーが発生します。ただし、gdb でコードをステップ実行している場合は、クライアントからの接続を正常に受け入れてデータを送信します。は純粋な仮想関数ではなく、それを呼び出す必要がありますServerRunnablerun

libPoco の Threading のコード例は、http: //pocoproject.org/slides/130-Threads.pdf にあります。

コンストラクターで純粋仮想メソッドを呼び出している可能性も考えていますが、コンストラクターには何もなく、デフォルトのデスタクターを使用しているだけです。どこでどの純粋仮想関数が呼び出されているかを特定する方法はありますか? gdbで?ありがとう。

4

2 に答える 2

2
Pool.start()

スレッドを開始して戻ります。そのため、リンクした PDF では、スレッドプールの例は次のようになります。

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

GDBでそれを踏むと、インスタンス変数が範囲外になる前に、スレッドにそのことをする時間を与えます。

于 2013-06-28T06:24:20.770 に答える