windows多執行緒代碼及分析



VOID Thread (PVOID pvoid)

{
HBRUSH hBrush ;
HDC hdc ;
int xLeft, xRight, yTop, yBottom, iRed, iGreen, iBlue ;
while (TRUE)
{
if (cxClient != 0 || cyClient != 0)
{
xLeft = rand () % cxClient ;
xRight = rand () % cxClient ;
yTop = rand () % cyClient ;
yBottom = rand () % cyClient ;
iRed = rand () & 255 ;
iGreen = rand () & 255 ;
iBlue = rand () & 255 ;
hdc = GetDC (hwnd) ;
hBrush = CreateSolidBrush (RGB (iRed, iGreen, iBlue)) ;
SelectObject (hdc, hBrush) ;
Rectangle (hdc, min (xLeft, xRight), min (yTop, yBottom),
max (xLeft, xRight), max (yTop, yBottom)) ;
ReleaseDC (hwnd, hdc) ;
DeleteObject (hBrush) ;
}
}
}
LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
switch (message)
{
case WM_CREATE:
_beginthread (Thread, 0, NULL) ;
return 0 ;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;

}

 中包含了表頭檔案PROCESS.H,這個檔案定義一個名爲_beginthread 的函數

,它啓動一個新的執行緒。只有定義了_MT 識

別字,纔會申明這個函式,這是/MT 旗標的另一個結果。

由CreateWindow 傳回的hwnd 值被儲存
在一個整體變數中,因此cxClient 和cyClient 值也可以由視窗訊息處理程式
的WM_SIZE 訊息獲得。

視窗訊息處理程數以最容易的方法呼叫_beginthread——簡單地以執行緒
函數的位址(稱爲Thread)作爲第一個參數,其他參數使用0,執行緒函數傳
回VOID並有一個參數,該參數是一個指向VOID的指針。

在RNDRCTMT中的Thread
函數不使用這個參數。

對程序中的所有執行緒來說,所有的靜態變量都是一樣的。

這就是視窗訊息處理程式設定整體的cxClient 和cyClient 變量並由Thread 函式使用的方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章