如何启动线程
- AfxBeginThread
指针则指向新建的线程对象或 NULL。
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,//指向工作线程的控件函数。 不能为 NULL。 必须对此函数声明如下:
//UINT __cdecl MyControllingFunction( LPVOID pParam );
LPVOID pParam, //传递到线程的参数(void *)。
int nPriority = THREAD_PRIORITY_NORMAL,//线程优先级
UINT nStackSize = 0, //以字节为单位指定新线程的堆栈大小。 如果为 0,堆栈大小默认与创建线程的堆栈大
//小相同。
DWORD dwCreateFlags = 0,
//指定一个额外的控制线程创建的标志。 此标志可以包含两个值之一:
//CREATE_SUSPENDED 开始挂起计数为 1 的线程。 如果要在线程开始运行之前初始化 CWinThread 对象的任何成员数
//据,如 m_bAutoDelete 或您的派生类的任何成员,请使用 CREATE_SUSPENDED。 完成初始化后,使用
//CWinThread::ResumeThread 使线程开始运行。 直到调用 CWinThread::ResumeThread,线程才会执行。
//0 创建后立即启动线程。
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL //指向安全特性结构,此结构为线程指定安全特性。
);
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,//从 CWinThread 派生的对象的 RUNTIME_CLASS。
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
----------------------------------------
AfxBeginThread 的第一个构造函数创建辅助线程。
第二个构造函数创建一个可用作用户界面线程或辅助线程。
AfxBeginThread 可创建新的 CWinThread 对象,调用其 CreateThread 函数以开始执行线程,然后将指针返回到线程。
在整个过程中进行检查,确保假如创建过程的任何部分出现故障,所有对象都能被正确地解除分配。
若想关闭线程,请从线程内调用 AfxEndThread,或从辅助线程的控制函数返回。
例如
CWinThread *threadTest= AfxBeginThread(MemoryDraw, Param,THREAD_PRIORITY_NORMAL);
- _beginthreadex
在这里插入代码片
如何结束线程
- 通过消息
如果你的线程是从CWinThread继承出来的,结束自己就用AfxEndThread,如果是外部调用的话,可以用PostThreadMessage(m_nThreadID, WM_QUIT,0,0);给这个线程发送消息,线程就会结束的,其中的m_nThreadID是线程ID。
线程的ID可以这样得到
private:
DWORD h_MemoryDraw;//定义变量
h_MemoryDraw = AfxBeginThread(MemoryDraw, Param)->m_nThreadID;
- 通过事件CEvent
在线程中不断循环判断运行条件
HANDLE working=CreateEvent(NULL,TRUE,TRUE,NULL);
....
while (WAIT_OBJECT_0==WaitForSingleObject(working,0))
{
.....
}
需要结束线程时只需让线程的循环结束,线程就可退出结束了.
ResetEvent(working);
- 线程内部调用 AfxEndThread