下面的一个例子是我在csdn上看到的,作者的目的是:
“我”写了一个全局线程函数,那么如何用AfxBeginThread调用,我在视图的OnInitialUpdate中这样AfxBeginThread(CChCtrlThreadProc, GetSafeHwnd());启动可以吗,我想让这个线程每100毫秒运行一次。我刚接触多线程,底子太薄,看书总是
迷迷糊糊的,对这个例子我不能吃透,大虾们帮我解释一下,行吗?CEvent m_hExitEvent(FALSE,TRUE);void StartThread()
{
m_hExitEvent.ReSetEvent();
//书上讲他是将一个事件设置成无信号状态,请问他的含义是不是下面的执行语句独占
//进程资源,而其他的线程不能访问,还是是别的含义?
m_hThread= AfxBeginThread(CChCtrlThreadProc, GetSafeHwnd());
//这是开始一个线程吧,假如在这一步后,在创建多个线程,那他们的执行顺序是不是
//是随机的,可以控制吗?
}void EndThread()
{
m_hExitEvent.SetEvent();
//SetEvent将一个事件设置成有信号状态,是不是当前线程释放进程资源,其他线程可以
访问
WaitForSingleObject(m_hThread,INFINITE);
//此语句在这里起什么作用?
}DWORD CChCtrlThreadProc(...)
{
while( WaitForSingleObject(m_hExitEvent,100)==WAIT_TIMEOUT )
//此句是不是当线程拥有进程的资源超过0。1s后,执行下面的数据
{
//do something ...
} return 0;
}吐血请各位大虾指导!
“我”写了一个全局线程函数,那么如何用AfxBeginThread调用,我在视图的OnInitialUpdate中这样AfxBeginThread(CChCtrlThreadProc, GetSafeHwnd());启动可以吗,我想让这个线程每100毫秒运行一次。我刚接触多线程,底子太薄,看书总是
迷迷糊糊的,对这个例子我不能吃透,大虾们帮我解释一下,行吗?CEvent m_hExitEvent(FALSE,TRUE);void StartThread()
{
m_hExitEvent.ReSetEvent();
//书上讲他是将一个事件设置成无信号状态,请问他的含义是不是下面的执行语句独占
//进程资源,而其他的线程不能访问,还是是别的含义?
m_hThread= AfxBeginThread(CChCtrlThreadProc, GetSafeHwnd());
//这是开始一个线程吧,假如在这一步后,在创建多个线程,那他们的执行顺序是不是
//是随机的,可以控制吗?
}void EndThread()
{
m_hExitEvent.SetEvent();
//SetEvent将一个事件设置成有信号状态,是不是当前线程释放进程资源,其他线程可以
访问
WaitForSingleObject(m_hThread,INFINITE);
//此语句在这里起什么作用?
}DWORD CChCtrlThreadProc(...)
{
while( WaitForSingleObject(m_hExitEvent,100)==WAIT_TIMEOUT )
//此句是不是当线程拥有进程的资源超过0。1s后,执行下面的数据
{
//do something ...
} return 0;
}吐血请各位大虾指导!
{
m_hExitEvent.ReSetEvent(); // 设置成未发生事件.
m_hThread= AfxBeginThread(CChCtrlThreadProc, GetSafeHwnd());
// 启动那个CChCtrlThreadProc线程
}void EndThread()
{
m_hExitEvent.SetEvent();
//设置事件发生
WaitForSingleObject(m_hThread,INFINITE);
//一直等待线程结束.
}DWORD CChCtrlThreadProc(...)
{
while( WaitForSingleObject(m_hExitEvent,100)==WAIT_TIMEOUT )
//查看是不是m_hExitEvent那个事件已经发生了? 等待100ms,如果100ms内未发生则返回WAIT_TIMEOUT,这时进行下面的语句do something...,否则结束线程.
{
//do something ...
} return 0;
}
-------------------------------------------------------------
m_hExitEvent 是在外部控制线程的一个信号,如果触发它,即可让线程检测到,而退出.结束线程的生命.各线程是操作系统控制的按时间片轮转的程序块.按操作系统内部的表轮转,不是随机的,在宏观上看好象是各线程函数是同时执行的.
当函数StartThread()的时候:
一开始,先将一个exitevent置为nonsignal的状态,然后启动线程。这之后,一个心的独立线程开始运行,就是对应函数CChCtrlThreadProc的那部分代码。主线程调用的函数在完成线程的创建后退出。同时新线程开始运行。这时候它会遇到WaitForSingleObject这个函数,函数等待exitevent成为signal的状态,但是没有其他的线程会去改变这个exitevent。所以函数超时返回WAIT_TIMEOUT,使得循环条件成立,完成需要的代码。这样不断的循环。一直到这个exitevent的状态成为signal时才会退出循环。主线程一旦开始调用函数EndThread()情况就要开始改变了。这个函数就会将exitevent置signal状态。然后等待那个创建线程的句柄,等待句柄无效后函数就可以退出了。在新建立的线程中,循环一直进行着,但是一旦exitevent的状态成为signal时,waitforsingleobject函数就不会返回超时,循环也就结束了。之后这个线程会随线程函数的返回而退出。系统自动将线程句柄置无效。这样导致等待线程句柄的等待函数返回。标志着原先创建的线程结束。然后EndThread返回。主线程完成其他任务。不知道我这样说是不是对你有启发。