/* スレッドの作成と優先順位 1998/11/ 1 宍戸 輝光 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); DWORD WINAPI fnThread1(LPVOID); DWORD WINAPI fnThread2(LPVOID); HINSTANCE hInst; HWND hwnd,hwLabel1,hwLabel2; HANDLE hThread1,hThread2; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; hInst=hInstance; /* プロセスのハンドルを保存 */ wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); RegisterClassEx (&wndclass); hwnd = CreateWindow ("CWindow","スレッドの作成と優先順位", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,340,160, NULL,NULL,hInstance,NULL); ShowWindow (hwnd,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hwnd); /* 再描画 */ while (GetMessage (&msg,NULL,0,0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static HWND hwBtnStart; static int d; switch (iMsg) { case WM_CREATE: hwLabel1=CreateWindow("STATIC","Thread1", /* スレッド1ラベル */ WS_CHILD | WS_VISIBLE | SS_LEFT, 8,8,160,32,hwnd,(HMENU)2,hInst,NULL); hwLabel2=CreateWindow("STATIC","Thread2", /* スレッド2ラベル */ WS_CHILD | WS_VISIBLE | SS_LEFT, 172,8,160,32,hwnd,(HMENU)3,hInst,NULL); hwBtnStart=CreateWindow("Button","Start", /* ボタン作成 */ WS_CHILD | WS_VISIBLE , 64,48,80,32,hwnd,(HMENU)0,hInst,NULL); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 0: /* Startボタン */ hThread1=CreateThread(NULL,0,fnThread1,0,0,&d); /* スレッド作成 */ hThread2=CreateThread(NULL,0,fnThread2,0,0,&d); SetThreadPriority(hThread1,THREAD_PRIORITY_HIGHEST); SetThreadPriority(hThread2,THREAD_PRIORITY_LOWEST); return 0; } break; case WM_DESTROY : PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } DWORD WINAPI fnThread1(LPVOID lpV) { int i; char lpszStr[64]; i=0; /* カウンタ変数クリア */ while (i<10000) { /* スレッドの終了指示まで */ i++; /* カウンタを一つ増やす */ wsprintf(lpszStr,"Thread1 %8d",i); SetWindowText(hwLabel1,lpszStr); /* カウンタの数を表示 */ } return 0; } DWORD WINAPI fnThread2(LPVOID lpV) { int i; char lpszStr[64]; i=0; while (i<10000) { i++; wsprintf(lpszStr,"Thread2 %8d",i); SetWindowText(hwLabel2,lpszStr); } return 0; }