1

私のアプリケーションには、アプリケーションを実行する単純な Execute メソッドがあります。これは非常に単純化されており、次のようになります。

App::Execute()
{
     Initialize();

     SDL_Event event;        
     While(Running)
     {
         while(SDL_PollEvent(&event) > 0)
         {
             HandleEvent(&event);
         }

         Render();
     }
}

Render() は次のようになりますが、これも単純化されています。

App::Render()
{
    SDL_FillRect(MainSurface, NULL, 0x000000); // MainSurface is declared inside the class

    // mCurrentScreen->Render(MainSurface);

    SDL_Flip(MainSurface);
}

デバッガがアタッチされている場合、これは正常に機能しますが、実行可能ファイルを実行すると、アプリケーションがフリーズし、gdb がプロセスにアタッチされます。メイン スレッドが SDL_Flip() 内でスタックしていることがわかります。

ソケットを使用してクライアントをリッスンする別のスレッドを起動することで、この問題を絞り込むことができました。この 2 番目のスレッドの開始をコメントアウトすると、すべてのモードで動作するようになります。

スレッドは、クラス「サーバー」内で次のように開始されます。

Server::Start()
{
    mThread = std::thread([this](){ListenThread(this); });
}

ListenThread は通常のソケット設定 getaddrinfo()、socket()、bind()、listen() を行い、最後にブロッキング関数 accept() の呼び出しを行います。

繰り返しますが、このサーバー、およびレンダリングとすべては、デバッガーが接続されている場合に完全に機能します。ハングするのは「直接」起動された場合のみです (停止するにはプロセスを強制的に強制終了します)。

サーバーとアプリには共通のデータ構造がありません。サーバーはアプリについて何も知りません。2 つの間の唯一の関係は、アプリがサーバーにコールバック関数を設定することです。

 mServer->Callback = [this](Command cmd){ this->CommandReceived(); });

編集(追加):これは私のPCでのみ発生し、ラップトップでまったく同じセットアップ(ubuntu、gcc、sdlバージョンなど)を使用しており、ラップトップで正常に動作します。それが関連しているかどうか/どのように関連しているかを確認してください。ただし、Windows 8のHyper-V仮想マシン内でUbuntuを実行しています。

4

0 に答える 0