天天看點

結束逾時的耗時線程 - 兩種方法

// 所有原創文章轉載請注明作者及連結

// blackboycpp(AT)gmail.com

// QQ群: 135202158

有時候我們需要線程執行指定的時間後, 結束它,

例如,讓采集線程采集100秒的資料。

這時, 就需要線上程超過時間限制後結束它。

下面給出了Win32 console小例子, 使用VC++ 2005編譯:

 // main.cpp 主程式

#define WIN32_LEAN_AND_MEAN

#include <windows.h>

#include <stdio.h>

HANDLE hEvent; // 全局Event對象

HANDLE hThread; // 全局線程對象

bool bFlag; // 控制線程循環的條件

DWORD WINAPI FuncThreadA(LPVOID p);

DWORD WINAPI FuncThreadB(LPVOID p);

int funcA(void);

int funcB(void);

int main(int argc, char** argv)

{

hEvent = INVALID_HANDLE_VALUE;

hThread = INVALID_HANDLE_VALUE;

bFlag = false;

// ----- 以下2段代碼擇一檢測之 -------

//int ret = funcA();

//printf("funcA return: %d/n", ret);

int ret = funcB();

printf("funcB return: %d/n", ret);

// ---------------------------------------

if(hThread != INVALID_HANDLE_VALUE) CloseHandle(hThread);

if(hEvent != INVALID_HANDLE_VALUE) CloseHandle(hEvent);

getchar();

return 0;

}

// funcA()線上程操作逾時時, 使用Event對象結束之

int funcA(void)

{

hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);

DWORD threadID;

int value = 111;

hThread = CreateThread(NULL, 0, FuncThreadA, (LPVOID)&value, 0, &threadID);

DWORD ret = WaitForSingleObject(hThread, 3000);

if(ret == WAIT_OBJECT_0)

{

return 0;

}

else if(ret == WAIT_TIMEOUT)

{

ResetEvent(hEvent);

return 1;

}

return 2;

}

// funcB()線上程操作逾時時, 改變線程的循環條件bFlag結束之

int funcB(void)

{

DWORD threadID;

int value = 222;

bFlag = true;

hThread = CreateThread(NULL, 0, FuncThreadB, (LPVOID)&value, 0, &threadID);

DWORD ret = WaitForSingleObject(hThread, 3000);

if(ret == WAIT_OBJECT_0)

{

return 0;

}

else if(ret == WAIT_TIMEOUT)

{

bFlag = false;

return 1;

}

return 2;

}

// FuncThreadA()使用Event對象的信号态來控制循環

DWORD WINAPI FuncThreadA(LPVOID p)

{

int value = *(int*)p;

while(1)

{

DWORD ret = WaitForSingleObject(hEvent, INFINITE);

if(ret == WAIT_OBJECT_0)

{

// do somethig....

printf("-%d-/n", value);

Sleep(100);

SetEvent(hEvent);

}

}

return 0;

}

// FuncThreadB()使用bool型的循環條件控制循環

DWORD WINAPI FuncThreadB(LPVOID p)

{

int value = *(int*)p;

while(bFlag == true)

{

// do somethig....

printf("-%d-/n", value);

Sleep(100);

}

return 0;

}

下一篇: Revive