Win32 - 如何控制你的線程
一、如何安全的結束你的線程
在你的線程中設立一個標志,利用其值要求線程結束自己. 我們不是要寫一個 busy loop 來檢驗標志值,我們使用一個手動設置的 event 對象。Wroker 線程可以檢查 event 對象的狀態或是等待它,視情況而定。
主線程代碼:
--------------------------------------
HANDLE hThreads[2];
DWORD dwThreadID;
DWORD dwExitCode = 0;
hRequestExitEvent = CreateEvent(
NULL, /* Detault security */
TRUE, /* Manual reset */
FALSE, /* Non-active state */
NULL); /* Event name */
for (int i = 0; i < 2; ++i)
hThreads[i] = CreateThread(
NULL, /* Default security */
0, /* Default stack size */
ThreadFunc, /* Thread function address */
(LPVOID)i, /* Thread parameter */
0, /* Start when creating */
&dwThreadID);
Sleep(1000);
SetEvent(hRequestExitEvent);
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
for (i = 0; i < 2; ++i)
CloseHandle(hThreads[i]);
線程代碼:
--------------------------------------
for (i = 0; i < 1000000; ++i)
{
// do something
if (WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT)
{
printf("Received request to terminate\n");
return (DWORD) -1;
}
}
二、調整線程優先權
BOOL SetThreadPriority(HANDLE hThread, int nPriority);
hThread - 代表線程
nPriority - 優先權層級數
TRUE - 成功; FALSE - 失敗
可用下面函數獲得線程優先權層級數:
int GetThreadPriority(HANDLE hThread);
三、創建線程時指定優先權
HANDLE hThread;
DWORD thrdId;
hThread = CreateThread(NULL,
0,
ThreadFunc,
0,
CREATE_SUSPEND,
&thrdId)
SetThreadPriority(thrdId, THREAD_PRIORITY_IDLE);
一旦線程設置妥當,可調用下面函數執行:
DWORD ResumeThread(HANDLE hThread);
該函數失敗時返回 0xFFFFFFFF
posted on 2009-11-27 18:17 Normandy 閱讀(2328) 評論(10) 編輯 收藏 引用 所屬分類: Programming