- ベストアンサー
プログラムを終わらせてください。
下のプログラムが終わらなくて困っています。 終わらせる方法を教えてください。 #include <windows.h> #pragma argsused HWND hWmain; DWORD WINAPI Th(LPVOID) { char s[99]; for(unsigned i=0;i<4294967295;i++) SetWindowText(hWmain,itoa(i++,s,10)); return 0; } LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { static HANDLE hTh; DWORD thId; DWORD ExitCode; switch(wM) { case WM_CREATE: hTh=CreateThread(0,0,Th,0,0,&thId); return 0; case WM_DESTROY: GetExitCodeThread(hTh,&ExitCode); ExitThread(ExitCode); if(hTh!=0)CloseHandle(hTh); PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; MSG ms; wc.lpszClassName ="Q"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hIcon =LoadIcon(hI,0); wc.hCursor =LoadCursor(0,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =0; RegisterClass(&wc); hWmain=CreateWindow("Q","",WS_OVERLAPPEDWINDOW,0,0,99,99,0,0,hI,0); ShowWindow(hWmain,SW_SHOW); UpdateWindow(hWmain); while(GetMessage(&ms,0,0,0)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); }
- keyguy
- お礼率68% (895/1314)
- C・C++・C#
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>case WM_DESTROY: >GetExitCodeThread(hTh,&ExitCode); >ExitThread(ExitCode); >if(hTh!=0)CloseHandle(hTh); スレッド hTh を強制終了させても問題ないのであれば、 case WM_DESTROY: if (hTh) { TerminateThread(hTh, 0); CloseHandle(hTh); } とすれば終了しそうです。 しかし、スレッドの強制終了はあまり好ましくないので、スレッド hTh が自分自身で終了するように作成するべきです。 初期値 FALSE の変数に メインスレッド側で TRUE を書き込むことで終了リクエストとし、スレッド hTh は、その変数を定期的に見に行って、自分自身で ExitThread を呼び出すような方法が最も簡単です。 メインスレッド側では、リクエストを出したあとに、WaitForSingleObject(hTh, ...) などでスレッド hTh の終了を待ちます。タイムアウトなら強制終了させることになるでしょう。
その他の回答 (1)
>もし何か情報が有れば教えてください。 TerminateThreadで問題があるかどうかは、そのスレッドが何をしているかって事だと思います。 GDIリソースなどをリークさせてしまう事もあるでしょうし、ファイルアクセスや通信がクローズまでいかずに終了させられるのは気持ち悪いですよね。 >メインウィンドウでWaitForSingleObjectを使うとロックしやすいので使わないで単純に以下のようにしたら問題でしょうか? Th で hWmain を参照していますが、タイミングしだいで DestroyWindow されたウィンドウにアクセスすることになります。 終了までに時間のかかるスレッドがあるならば、WM_CLOSE で「終了中です。しばらくお待ちください」などを表示させて、Th が終了する直前に Th からメッセージをポストさせ、メッセージを受けて DestroyWindow する方法なども考えられます。 >if(*(boolean*)p==true)break; boolean には volatile を付加した方が間違いがなくていいです。
お礼
*(int*)p=2; と SendMessage(hWmain,WM_CLOSE,0,0); の 間に再びクローズマークをクリックされるとまずそうですね?
補足
ありがとうございます。 以下のようにしました。 #include <windows.h> HWND hWmain; DWORD WINAPI Th(LPVOID p) { char s[99]; for(unsigned i=0;i<unsigned(-1);i++) { SetWindowText(hWmain,itoa(i,s,10)); if(0<*(int*)p)break; } *(int*)p=2;SendMessage(hWmain,WM_CLOSE,0,0); return 0; } LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { static int iEnd; static HANDLE hTh; DWORD ID; switch(wM) { case WM_CREATE: iEnd=0; hTh=CreateThread(0,0,Th,&iEnd,0,&ID); return 0; case WM_CLOSE: if(iEnd<2) iEnd=1; else DestroyWindow(hW); return 0; case WM_DESTROY: if(hTh)CloseHandle(hTh); PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } }
関連するQ&A
- void main(void){...}だとDosWindowが開くので
わざわざWindowsアプリにして以下のようにするしかないのでしょうか? LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { //ここに宣言を置く switch(wM) { case WM_CREATE: //ここに処理を置く return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS) { WNDCLASS wc; HWND hW,hPW; MSG ms; wc.lpszClassName ="goo"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =NULL; wc.cbWndExtra =NULL; wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =NULL; RegisterClass(&wc); hW=CreateWindow ( "goo", "教えて!goo", WS_OVERLAPPED, 0, 0, 640, 456, NULL, NULL, hI, NULL ); ShowWindow(hW,nCS); UpdateWindow(hW); while(GetMessage(&ms,NULL,NULL,NULL)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); } もっと簡単にDosWindowが開かないようにする方法はないのでしょうか? もしないとすると上記記述でもっと簡単にできないでしょうか?
- ベストアンサー
- C・C++・C#
- lpszCPを取り出したい
Winアプリにファイルをドラッグしてファイル名を取るために下記のような記述をして一応取り出せたのですが str_argにような外部変数を利用するよりも正当なやり方はないのですか? 例えばメッセージのメンバに格納されている場合にはそれを使うとか・・・ よろしくお願いします string str_arg; LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP); WINAPI WinMain(HINSTANCE hI,HINSTANCE hPI,LPSTR lpszCP,int nCS) { WNDCLASS wc; HWND hW; MSG ms; str_arg=lpszCP;
- ベストアンサー
- C・C++・C#
- 自作関数の使い方
ウインドウの左上に1を表示させたいのに デスクトップの左上に1が表示される。 ソースを直してください。 #include <windows.h> HWND hWnd; void f(); LRESULT CALLBACK WndProc(HWND ,UINT ,WPARAM ,LPARAM); int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE ,LPSTR , int){ HWND hWnd; MSG msg; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.lpszMenuName = NULL; wc.lpszClassName = "CNAME"; wc.hIcon = LoadIcon(NULL , IDI_APPLICATION); wc.hCursor = LoadCursor(NULL , IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); if (!RegisterClass(&wc))return 0; hWnd = CreateWindow(wc.lpszClassName , "EXE" , WS_OVERLAPPEDWINDOW | WS_VISIBLE , CW_USEDEFAULT , CW_USEDEFAULT , 200 , 150, NULL , NULL , hInstance , NULL); while(GetMessage(&msg , NULL , 0 , 0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd ,UINT msg ,WPARAM wParam ,LPARAM lParam){ HDC hDC; switch (msg){ case WM_LBUTTONDOWN: f(); break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd , msg , wParam , lParam)); } return (0L); } void f(){ HDC hDC; hDC = GetDC(hWnd); TextOut(hDC,0,0,"1",1); ReleaseDC(hWnd, hDC); }
- ベストアンサー
- C・C++・C#
- WinAPIでの画像高速切り替え表示プログラム2
1の続きです。これを先に見た方は1から見てください。 お願いします。 int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__," ", WS_POPUP | WS_VISIBLE, 0,0, 1024,768, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; // タイマを作成する SetTimer( hWnd, TIMER_ID, TIMER_ELAPSE, NULL ); BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } // タイマを破棄する KillTimer( hWnd, TIMER_ID ); return (int)msg.wParam; } 2つに分かれてしまって申し訳ありません。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 再起動したとき前起動分を強制終了するには?
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS) { WNDCLASS wc; HWND hW; MSG ms; wc.lpszClassName ="goo"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =NULL; wc.cbWndExtra =NULL; wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =NULL; RegisterClass(&wc); hW=CreateWindow ( "goo", "教えてgoo", WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME |WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU, 0, 0, 640, 480, NULL, NULL, hI, NULL ); ShowWindow(hW,nCS); UpdateWindow(hW); while(GetMessage(&ms,NULL,NULL,NULL)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); } のプログラムが2回目に起動したとき1回目の起動を強制終了するにはどうしたらいいのでしょうか?
- ベストアンサー
- C・C++・C#
- ShellAbout(hWnd,"","",LoadIcon(?));
BCC32 で、 ShellAbout(hWnd,"","",LoadIcon(hInst, IDI_APPLICATION)); ShellAbout(hWnd,"","",LoadIcon(NULL, IDI_APPLICATION)); ↑ならアイコンに関してどっちでもできるけど、リソースで MYICONSM ICON DISCARDABLE "ico.ico" として、 ShellAbout(hWnd,"","",LoadIcon(hInst, "MYICON"); ShellAbout(hWnd,"","",LoadIcon(NULL, "MYICON")); ↑はアイコンに関してどっちも無効で旗になります。 BCC32 で ShellAbout( ) で自作アイコンを表示するには どうしたらいいんですか? #include <windows.h> #include <shellapi.h> HINSTANCE hInst; HICON hIcon; LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ switch (uMsg){ case WM_LBUTTONDOWN: ShellAbout(hWnd,"","",?; break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd,uMsg,wParam,lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int){ HWND hWnd; WNDCLASSEX wc; MSG msg; wc.cbSize =略 wc.style = wc.lpfnWndProc = wc.hInstance = wc.cbClsExtra = wc.cbWndExtra = wc.lpszMenuName = wc.lpszClassName = wc.hIcon = wc.hCursor = wc.hbrBackground = RegisterClassEx(&wc); hWnd = CreateWindow(wc.lpszClassName,"TEST",WS_OVERLAPPEDWINDOW, 0,0,640,480,NULL,NULL,hInst,NULL); ShowWindow(hWnd,SW_SHOWNORMAL); UpdateWindow(hWnd); while(GetMessage( &msg, NULL, 0, 0)){ TranslateMessage( &msg ); DispatchMessage( &msg ); } return 0; }
- 締切済み
- C・C++・C#
- 最初ボタンが見えない
ボタンを大きく中央に表示するプログラムを作りました。 しかし中央をクリックするまでボタンが現れません。 どうしたら最初からボタンが現れるのでしょうか? またフォントをクリエイトし続けてリソースは尽きないのでしょうか? #include <windows.h> #include <stdio.h> HWND hB; LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { RECT rt; char s[99]; int W,H; static HFONT hF; switch(wM) { case WM_PAINT: GetClientRect(hW,&rt); W=rt.right-rt.left;H=rt.bottom-rt.top; DeleteObject(hF); hF=CreateFont(H/4,W/4,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"MS Pゴシック"); SendMessage(hB,WM_SETFONT,(WPARAM)hF,1); MoveWindow(hB,W/4,H/4,W/2,H/2,1); sprintf(s,"幅=%d,高さ=%d",H,W);SetWindowText(hW,s); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; --略--(ここにウィンドウクラスwcをクラス名"I"で登録) RegisterClass(&wc); hW=CreateWindow("I","ボタンの親",WS_OVERLAPPEDWINDOW,0,0,0,0,0,0,hI,0); hB=CreateWindow("BUTTON","子",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,0,0,hW,0,hI,0); ShowWindow(hW,SW_SHOWMAXIMIZED); UpdateWindow(hW); while(GetMessage(&ms,0,0,0)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); }
- ベストアンサー
- C・C++・C#
- 再起動時、前起動分のハンドルを得る方法は?
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS) { WNDCLASS wc; HWND hW; MSG ms; //ここで前起動クローンのアプリやWindowのハンドルを取得したい wc.lpszClassName ="goo"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =NULL; wc.cbWndExtra =NULL; wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =NULL; RegisterClass(&wc); hW=CreateWindow ( "goo", "教えてgoo!", WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU, 0, 0, 640, 456, NULL, NULL, hI, NULL ); ShowWindow(hW,nCS); UpdateWindow(hW); while(GetMessage(&ms,NULL,NULL,NULL)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); } 上記アプリで//行で前起動時のWindowのハンドルを得るにはどうしたらいいのでしょうか?
- ベストアンサー
- C・C++・C#
- win32apiにおける終了処理について
下記のプログラムを実行してウィンドウを閉じるボタンで閉じると、 ウィンドウは消えるのですがなぜかプロセスが残ってしまいます。 正直、お手上げなので教えて頂けると幸いです。 よろしくお願いします。 #include<windows.h> #define APP_NAME TEXT("Sample_MainWindow") /*ウィンドウプロシージャ*/ LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; } /*基本的なメッセージの処理*/ return DefWindowProc(hWnd, uMsg,wParam,lParam); } /*WinMain*/ int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { HWND hWnd; WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = DefWindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1; wc.lpszMenuName = NULL; wc.lpszClassName = APP_NAME; if (!RegisterClass(&wc)){ MessageBox(NULL,TEXT("ウィンドウクラスの作成に失敗しました"),NULL,MB_OK); return 0; } hWnd = CreateWindow( APP_NAME, TEXT("Window Title"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); if(hWnd == NULL){ MessageBox(NULL,TEXT("ウィンドウの生成に失敗しました"),NULL,MB_OK); return 0; } /*メッセージループ*/ while(GetMessage(&msg, NULL,0,0)){ DispatchMessage(&msg); } return (int)msg.wParam; }
- 締切済み
- その他(プログラミング・開発)
- 子ウィンドウの作成方法
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); TCHAR szClassName[] = TEXT("Window01"); TCHAR szClassName2[] = TEXT("Window02"); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow){ MSG msg; BOOL bRet; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; WNDCLASSEX wc2; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szClassName; wc.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.cbSize = sizeof(WNDCLASSEX); wc2.style = CS_HREDRAW | CS_VREDRAW; wc2.lpfnWndProc = WndProc; wc2.cbClsExtra = 0; wc2.cbWndExtra = 0; wc2.hInstance = hInst; wc2.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc2.lpszMenuName = NULL; wc2.lpszClassName = szClassName; wc2.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); if((RegisterClassEx(&wc)||RegisterClassEx(&wc2)==0)) return 0; return TRUE; } BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; HWND hWnd2; hWnd = CreateWindow(szClassName, TEXT("親ウィンドウ"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL ); if(!hWnd) return FALSE; hWnd2 = CreateWindow(szClassName2, TEXT("子ウィンドウ"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, hInst, NULL ); if(!hWnd2) return FALSE; ShowWindow(hWnd, nCmdShow); ShowWindow(hWnd2, nCmdShow); UpdateWindow(hWnd); UpdateWindow(hWnd2); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } 子ウィンドウの作り方を理解したく、ただウィンドウを表示するプログラムを作ろうとしました。 しかし、うまくいきません。 一体なにがダメなんでしょうか?
- ベストアンサー
- C・C++・C#
お礼
メインウィンドウでWaitForSingleObjectを使うとロックしやすいので使わないで単純に以下のようにしたら問題でしょうか? 動作は問題ないのですが、スレッドの終わりを確認せずにウィンドウを終了している点が気になります。 #include <windows.h> HWND hWmain; DWORD WINAPI Th(LPVOID p) { char s[99]; for(unsigned i=0;i<unsigned(-1);i++) { SetWindowText(hWmain,itoa(i,s,10)); if(*(boolean*)p==true)break; } return 0; } LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { static boolean bEnd; static HANDLE hTh; DWORD ID; switch(wM) { case WM_CREATE: bEnd=false; hTh=CreateThread(0,0,Th,&bEnd,0,&ID); return 0; case WM_DESTROY: bEnd=true; if(hTh)CloseHandle(hTh); PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { .............................
補足
ありがとうございます。 その方法で動きました。 しかしマイクロソフトサイトのコマンドの説明によると両方とも機能は 「1 つのスレッドを終了させます。」 となっていて ExitThread 解説 スレッドを終了するには、ExitThread 関数を使うのが好ましい方法です。この関数を呼び出すと(開発者が明示的に呼び出すか、スレッドプロシージャが制御を返す際に自動的に呼び出す)、現在のスレッドのスタックは割り当てを解除され、そのスレッドは終了します。そのスレッドにアタッチしているすべての DLL の各エントリポイント関数は、終了コードを受け取って、そのスレッドが DLL からデタッチされていることを通知されます。 TerminateThread 解説 この関数は、スレッドを終了させます。そして、指定したスレッドには、ユーザーモードのコードを実行する機会と、初期のスタックの割り当てを解除する機会がありません。またこの関数は、終了処理が進行中であることを、そのスレッドにアタッチしている DLL へに通知しません。 TerminateThread 関数は、スレッドを無条件に終了させる危険な関数であり、非常に特別な場合にのみ使うべきです。対象とするスレッドが何を実行しているのか正確に把握していて、指定したスレッドが終了の時点で実行している可能性のあるすべてのコードを制御できる場合にのみ呼び出すべきです。 もし何か情報が有れば教えてください。 確かにスレッドが自分で終了するような構成の方がよいので今後は助言の方針で移行と思います。