通过Event事件正确结束线程
来源:互联网 发布:老船木家具网淘宝 编辑:程序博客网 时间:2024/06/05 00:44
步骤:
1. 首先声明一个全局的Event对象
HANDLE hRequestExitEvent = FALSE;
2. 在主线程中创建这个Event对象
hRequestExitEvent = CreateEvent(NULL, TRUE, false, NULL);
注意:此处的第三个参数应该使用false,因为如果使用true在事件创建开始就是处于
激发状态,这样就立刻结束线程了,所以此处应该使用false作参数
3. 在线程函数中使用如下语句来不断探测Event对象的状态并确定是否退出线程
WaitForSingleObject(hRequestExitEvent, 0)
注意:此处的此处的第二个参数为0,这里使用了WaitForSingleObject()函数一个很重
要的用途,设定这个参数为0,是你能够检查handle的状态并立刻返回,没有片刻停留,
如果handle已经备妥,这个函数会成功并传回WAIT_OBJET_0,否则这个函数立刻传
回WAIT_TIMEOUT。
4. 在主线程中需要结束该线程的地方调用如下语句设置Event对象为激发状态
SetEvent(hRequestExitEvent);
这样便可安全的结束一个线程
参考代码:
说明:该实例代码参考《Win32 多线程程序设计(候捷译)》中的THRDTERM程序,该程序创建两个线程,周期性地检查一个Event对象,以决定要不要结束自己。
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include "MtVerify.h"
DWORD WINAPI ThreadFunc(LPVOID);
HANDLE hRequestExitEvent = FALSE; //设置全局EVENT对象
int main()
{
HANDLE hThreads[2];
DWORD dwThreadId;
DWORD dwExitCode = 0;
int i;
hRequestExitEvent = CreateEvent(
NULL, TRUE, false, NULL); // 创建Event对象
for (i=0; i<2; i++)
MTVERIFY( hThreads[i] = CreateThread(NULL,
0,
ThreadFunc,
(LPVOID)i,
0,
&dwThreadId )
);
// Wait around for awhile, make
// sure the thread is running.
Sleep(1000);
SetEvent(hRequestExitEvent); //设置Event对象为激发状态,结束线程
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE); // 等待两个线程都成为激发状
态,可以保证线程都已安全地离开。
printf("1234/n");
for (i=0; i<2; i++)
MTVERIFY( CloseHandle(hThreads[i]) );
return EXIT_SUCCESS;
}
DWORD WINAPI ThreadFunc(LPVOID p)
{
int i;
int inside = 0;
UNREFERENCED_PARAMETER(p);
/* Seed the random-number generator */
srand( (unsigned)time( NULL ) );
for (i=0; i<1000000; i++)
{
double x = (double)(rand())/RAND_MAX;
double y = (double)(rand())/RAND_MAX;
if ( (x*x + y*y) <= 1.0 )
inside++;
if (WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT) // 判断Event对
象是否为激发状态,从而决定是否退出
{
printf("Received request to terminate/n");
return (DWORD)-1;
}
}
printf("PI = %.4g/n", (double)inside / i * 4);
return 0;
}
- 通过Event事件正确结束线程
- 线程的正确结束方式
- 如何正确结束Java线程
- 线程同步--事件Event
- 经典线程同步 事件Event
- 经典线程同步 事件Event
- Android java 结束线程的正确操作
- 事件Event:简单的线程同步
- 事件Event:简单的线程同步【转】
- 事件Event:简单的线程同步
- 多线程6:经典线程同步 事件Event
- C++ 经典线程同步 事件Event(九)
- VC线程Thread和事件Event
- 线程同步 事件 Event 内核对象 CreateEvent
- windows多线程基础(3):如何正确结束线程
- Event System事件系统【SWING监听事件的线程问题】
- Event System事件系统【SWING监听事件的线程问题】
- 以事件通知线程结束,并等待线程安全退出
- Notes与SAP数据的互换
- 在ASP.NET中使用存储过程
- make the vs 2005 fly
- Struts logic 标签
- 删除确认对话框
- 通过Event事件正确结束线程
- 添加完整的Eclipse RCP帮助系统
- 网界网博客大赛—说出我的IT故事,拿千元大奖!
- 如何在linux/unix中设置线程的优先级
- 操作数据库的三种途径
- .net ViewState入门
- linux根目录下各文件夹的作用
- 手工去除MSN广告,手工去除qq广告
- 数学对程序员生涯的影响