私は2つのコードファイルを持っています.1つは私のWinMain()
関数と私のメインダイアログウィンドウに関連するすべての関数を含んでいます。もう一つはスレッドコールバックと私のプログラムに関連する変数関数を含んでいます。私はHWND hWnd = NULL
をMainDlg.cppのグローバル変数として定義し、Other.cpp(スレッドコールバックを含む)にextern HWND hWnd
を定義しました。スレッドは、WM_INITDIALOG
メッセージがウィンドウに送信されると作成されます。スレッドコールバック内では、長い操作が実行されるまで変数hWnd
はnullになり、その後は使用可能になります。呼び出しをブロックするまで外部変数はスレッドに使用できません。
MainDlg.cpp
HWND hWnd = NULL;
HANDLE hListenThread = NULL;
DWORD WINAPI ListenThread(LPVOID lpvParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
/* ... */
if(NULL == (hWnd=CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, (DLGPROC)WndProc)))
{
MessageBox(NULL, "Error creating the main dialog!", NULL, MB_OK | MB_ICONERROR);
return -1;
}
MSG msg;
while(GetMessage(&msg,NULL,0,0) && IsWindow(hWnd))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
BOOL CALLBACK WndProc(HWND hWndDlg, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_INITDIALOG:
{
DWORD dwListenThreadId = NULL;
/* referencing hWnd here works fine... */
/* ... */
hListenThread = CreateThread(
NULL,
0,
ListenThread,
hWndDlg,
0,
&dwListenThreadId);
/* ... */
} break;
}
return false;
}
Other.cpp
extern HWND hWnd;
DWORD WINAPI ListenThread(LPVOID lpvParam)
{
if(hWnd == NULL)
MessageBox(NULL, "hWnd == NULL", NULL, MB_OK | MB_SYSTEMMODAL);
if(hWnd != NULL)
MessageBox(NULL, "hWnd != NULL", NULL, MB_OK | MB_SYSTEMMODAL);
return 0;
}
アプリケーションが起動されたときにListenThread
コールバックで両方のメッセージボックスが表示されます。誰かがなぜこれが起こっているのか教えてもらえますか? ListenThread
の冒頭にwhile(hWnd == NULL);
を実行する以外にこれを解決する方法がありますか?
私が仕事から家に運転していたとして、私はそれが何であったかです実現。スレッドの 'lpvParam'パラメータに' hWndDlg'を渡すことは、実際にはこの質問にあってはいけません。これは、コードの開発の初期段階から、より多くの「extern」変数が必要であり、それを「extern」に変更することを発見する前からです。私はそれを削除することを忘れてしまった。 –