2

後の部分は私のプログラムですが、期待どおりに動作しません。メイン ウィンドウ プログラムが dll で関数 "MyDllIniSys" を呼び出す必要があります。メイン ウィンドウ プログラムが "bIAutoRender" を 1 以外に設定するまで、おそらく 32 マイクロ秒ごとに dll がウィンドウをレンダリングできるようにします。そしてすぐに戻る。しかし、私がやったことでは、プログラムは機能しません。スレッドが開始されても、元に戻らないからです。どうすれば入手できますか、誰か教えてください。ヘルプ。どうもありがとう

static void renderOneFrame(const boost::system::error_code& /*e*/,
    boost::asio::deadline_timer* t, int* iNeedAutoRender)
{


    //call Who use this DLL, let it refresh the window
    if(OnRefreshEvent)
    {
        OnRefreshEvent();
    }

    if(*iNeedAutoRender == 1)
    {
        t->expires_at(t->expires_at() + boost::posix_time::microseconds(iIRenderMicroSenconds));
        t->async_wait(boost::bind(renderOneFrame,
                boost::asio::placeholders::error, t, iNeedAutoRender));
    }

}

EXTERN_C MYDLLAPI INT MyDllIniSys(INT  WindowWidth,INT  WindowHeight)
{
    COgreRenderLoader myLoader;
    myLoader.IniOgre(externalWindowHandle,WindowWidth,WindowHeight);

    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::microseconds(iIRenderMicroSenconds));

    t.async_wait(boost::bind(renderOneFrame,
            boost::asio::placeholders::error, &t,&bIAutoRender));

    boost::thread thread1(boost::bind(&boost::asio::io_service::run, &io));
    //io.run();
    thread1.join();
    //thread1.start_thread();

    return 1;
}
4

1 に答える 1

0

thread1.join() を呼び出すと、thread1 の実行が完了するまでブロックされます。オフのままにしておくと、関数はスレッドを開始してすぐに戻ります。

この質問からわかるように、thread1 オブジェクトが範囲外になっても、スレッドは続行されます。

于 2013-06-11T21:48:27.280 に答える