できることがいくつかあります。
(1) CDialog::OnInitDialogメソッド内からダイアログにメッセージを投稿し、投稿されたメッセージのメッセージ ハンドラーで長い関数を処理することができます。そうすれば、最初にダイアログが表示され、その後長い関数が実行されます。
(2) 2 番目のオプションは、メッセージ ループにある程度の処理時間を確保することです。したがって、長い関数がある種のループである場合は、時折ProcessMessagesに呼び出しを追加して、メッセージ キューが空に保たれるようにします。
void ProcessMessages()
{
MSG msg;
CWinApp* pApp = AfxGetApp();
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
pApp->PumpMessage();
}
}
編集:そのような状況でスレッドを使用することは確かに可能ですが、そうすることには常にリスクと複雑さが伴うわけではありません。
GUIでスレッドを使用するということは、複数のメッセージ キューを処理しなければならないことを意味し、それはPostThreadMessageのような API を使用することを意味し、注意が必要な新しい一連の問題をもたらします。
このような問題の例については、次のリンクを参照してください。
http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx
どこで言う:
PostThreadMessage によって送信されるメッセージは、ウィンドウに関連付けられていません。原則として、ウィンドウに関連付けられていないメッセージは、DispatchMessage 関数によってディスパッチできません。したがって、受信者スレッドが (MessageBox または DialogBox で使用される) モーダル ループにある場合、メッセージは失われます。モーダル ループ中にスレッド メッセージをインターセプトするには、スレッド固有のフックを使用します。
私はZeus IDEでプロセス メッセージ アプローチを使用しています。これは、GUI がユーザーに応答し続けることを確認するのに非常にうまく機能します。また、実装が非常に簡単であるという利点もあります。