別の制御スレッドを使用してフォームをロードして実行しようとしています。部分的に読み込まれます。つまり、フォームは表示されますが、すべてのコントロールは表示されません。その後、応答がなくなり、原因がわかりません。私が知っていることはすべて試しました。メイン スレッドは、ウィンドウの作成と非表示、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);
}
フォームが応答しない理由を誰か教えてもらえますか? 私はあきらめようとしています。
ありがとう。