0

別の制御スレッドを使用してフォームをロードして実行しようとしています。部分的に読み込まれます。つまり、フォームは表示されますが、すべてのコントロールは表示されません。その後、応答がなくなり、原因がわかりません。私が知っていることはすべて試しました。メイン スレッドは、ウィンドウの作成と非表示、UI スレッドの作成、およびフォームのイベント ハンドラーによって非表示のウィンドウに送信されたメッセージの処理を行います。フォームをロックアウトしているタイトなメッセージ処理ループがあると思いますが、これを修正する方法がわかりません。

主な機能は次のとおりです。

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                        _In_opt_ HINSTANCE hPrevInstance,
                        _In_ LPTSTR    lpCmdLine,
                        _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;

    bShutdown = FALSE;

    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_TURBOCOPY, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Perform application initialization:
    if (!InitInstance (hInstance, SW_HIDE))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TURBOCOPY));
    g_UIThread.g_uipUIThread = _beginthread(UIThread, 0, (void *)hWnd);

    // Main message loop:
    while (!bShutdown) {
        if (PeekMessage(&msg, hWnd, 0, 0, PM_NOREMOVE)) {
            if (GetMessage(&msg, hWnd, 0, 0)) {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            }
            else {
                bShutdown = TRUE;
            }
        }
    }

    return (int) msg.wParam;
}

UIスレッドは次のとおりです。

void UIThread(void *pvParam)
{
    Main^ hForm = gcnew Main;

    hWnd = (HWND)pvParam;// Get hWnd as destination for messages triggered by form events
    hForm->Show();  // Show the main form

            // Process form events until this thread is terminated
    WaitForSingleObject(g_hUICloseEvent, INFINITE);
}

フォームのイベント ハンドラーがどのように機能するか (場合によっては機能しない場合もあります) の例を次に示します。

System::Void Main::btnCloseCancel_Click(System::Object^  sender, System::EventArgs^  e)
{
    SetEvent(g_hUICloseEvent);
    SendMessage(hWnd, WM_QUIT, NULL, NULL);
}

フォームが応答しない理由を誰か教えてもらえますか? 私はあきらめようとしています。

ありがとう。

4

0 に答える 0