Windows程序编译成功,而且在后台有运行,为什么没有显示可视化的窗口?
#include <windows.h>
#include "mltithrd.h"
HANDLE _hInst;
HANDLE _hWnd;
HANDLE _hThread[5];
UINT _uDelayType=NODELAY;
int APIENTRY WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wndclass;
UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(hPrevInstance);
_hInst = hInstance;
wndclass.style = 0;
wndclass.lpfnWndProc = (WNDPROC)MainWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (hInstance, "Multi1Icon");
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = "Multi1Menu";
wndclass.lpszClassName = "Multi1Class";
RegisterClass(&wndclass);
_hWnd = CreateWindow ("Multi1Class",
"Thread Priority Example",
WS_OVERLAPPED | WS_SYSMENU,
0, 0, 400, 250,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(_hWnd, nCmdShow);
while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return (msg.wParam);
}
LONG APIENTRY MainWndProc (HWND hWnd, UINT message,
UINT wParam, LONG lParam)
{
int i;
DWORD ThreadID[5];
static HMENU hMenu;
static HANDLE hMasterThread;
static DWORD ThreadArg[5] = {HIGHEST_THREAD, // 0x00
ABOVE_AVE_THREAD, // 0x3F
NORMAL_THREAD, // 0x7F
BELOW_AVE_THREAD, // 0xBF
LOWEST_THREAD // 0xFF
};
switch (message) {
case WM_CREATE:
hMenu = GetMenu (hWnd);
hMasterThread = GetCurrentThread();
SetThreadPriority(hMasterThread, THREAD_PRIORITY_HIGHEST);
for(i=0; i<5; i++)
_hThread[i] = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProc,
&ThreadArg[i],
CREATE_SUSPENDED,
&ThreadID[i]);
SetThreadPriority(_hThread[0], THREAD_PRIORITY_HIGHEST);
SetThreadPriority(_hThread[1], THREAD_PRIORITY_ABOVE_NORMAL);
SetThreadPriority(_hThread[2], THREAD_PRIORITY_NORMAL);
SetThreadPriority(_hThread[3], THREAD_PRIORITY_BELOW_NORMAL);
SetThreadPriority(_hThread[4], THREAD_PRIORITY_LOWEST);
return (0);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_RESUME:
EnableMenuItem(hMenu, IDM_RESUME, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_SUSPEND, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
for (i=0; i<5; i++)
ResumeThread(_hThread[i]);
return (0);
case IDM_SUSPEND:
for (i=0; i<5; i++)
SuspendThread(_hThread[i]);
EnableMenuItem(hMenu, IDM_SUSPEND, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_RESUME, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
return (0);
case IDM_FOR:
_uDelayType = FORLOOPDELAY;
EnableMenuItem(hMenu, IDM_FOR, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
return (0);
case IDM_SLEEP:
_uDelayType = SLEEPDELAY;
EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_FOR, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
return (0);
case IDM_NODELAY:
_uDelayType = NODELAY;
EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_FOR, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
return (0);
default:
return (0);
}
case WM_DESTROY :
for(i=0; i<5; i++)
TerminateThread(_hThread[i], 0);
PostQuitMessage (0);
return (0);
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
return (0L);
}
VOID ThreadProc(DWORD *ThreadArg)
{
RECT rect;
HDC hDC;
HANDLE hBrush, hOldBrush;
DWORD dwThreadHits = 0;
char cBuf[80];
int iThreadNo, i;
GetClientRect (_hWnd, &rect);
hDC = GetDC (_hWnd);
hBrush = CreateSolidBrush(RGB(*(ThreadArg), *(ThreadArg), *(ThreadArg)));
hOldBrush = SelectObject(hDC, hBrush);
switch (*ThreadArg) {
case HIGHEST_THREAD : iThreadNo = 0; break;
case ABOVE_AVE_THREAD : iThreadNo = 1; break;
case NORMAL_THREAD : iThreadNo = 2; break;
case BELOW_AVE_THREAD : iThreadNo = 3; break;
case LOWEST_THREAD : iThreadNo = 4; break;
}
wsprintf(cBuf, "T%d", iThreadNo);
TextOut(hDC, *(ThreadArg), rect.bottom-150, cBuf, lstrlen(cBuf));
wsprintf(cBuf, "P=%d", GetThreadPriority(_hThread[iThreadNo]));
TextOut(hDC, *(ThreadArg), rect.bottom-130, cBuf, lstrlen(cBuf));
do
{
dwThreadHits++;
Rectangle(hDC, *(ThreadArg), rect.bottom-(dwThreadHits/10),
*(ThreadArg)+0x40, rect.bottom);
if (_uDelayType == SLEEPDELAY)
Sleep(10);
else if (_uDelayType == FORLOOPDELAY)
for (i=0; i<100000; i++);
else // _uDelayType == NODELAY)
{ }
} while (dwThreadHits < 1000);
hBrush = SelectObject(hDC, hOldBrush);
DeleteObject (hBrush);
ReleaseDC (_hWnd, hDC);
}
