2017-07-09 6 views
-1

私のWin32アプリケーションが起動するときには、LoadDB()が実行され、少なくとも10秒または20秒かかる。 GUIウィンドウが応答しないようにするには、LoadDB()をバックグラウンド読み込みタスクとしてのどこで実行するのですか?Windows GUIアプリケーションを起動する際のバックグラウンドジョブ

別途作成する必要はありませんが、thread? (これは複雑に見え、私はそれを避けたかった)。


注:私は、メインメッセージループでそれを行う場合:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
     case WM_CREATE: 
      LoadDB(); 
      ... 

GUIが非応答になります。

+0

"これは複雑に見えます" - 複雑なことは複雑です。 –

+0

スレッドを生成し、そこにルーチンを配置します。 – Ron

+0

@NeilButterworth必要に応じて*私はそれをするのは大丈夫ですが、私は "別の方法はありませんか"と言いたいと思いました。 – Basj

答えて

1

スレッドを作成することは、実際にはあまり複雑ではありません。

スレッド間のやりとりをサポートする必要がある場合、状況はかなり複雑になる可能性がありますが、この場合、何かを開始して後でそれが完了したという通知が必要です。それでおしまい。

したがって、loadDB()を呼び出す小さな関数を記述してから(たとえば)PostMessageを呼び出して、アプリケーションの残りの部分にDBがロードされて使用可能であることを知らせる必要があります。

それ以上のことはありません。真剣に、それは本当に複雑で複雑ではありません。

+0

ありがとう@JerryCoffin。 LoadDB()の実行中にThread2によってロードされた 'std :: vector 'は、ロードが完了した時点でMainThreadからアクセスできますか? – Basj

+1

@Basj:アクセスしやすいようにするには、アクセス可能であることを確認する必要があります。たとえば、グローバル変数であれば、アクセス可能になります。動的に割り当てられている場合は、そのアドレスをコードの残りの部分に渡して、どこにそのアドレスが存在するかを伝える必要があります。しかし最終的には、スレッドはすべて同じアドレス空間を共有します。したがって、スレッドごとに行うことは、他のスレッドから見えるようにすることができます。 –

関連する問題