MFC学习笔记-线程

来源:互联网 发布:vr软件看不了 编辑:程序博客网 时间:2024/06/06 01:37

1,Timer的使用
1)选择类向导(Class wizard),点击消息(Message),选择WM_TIMER双击,应用退出

2)SetTimer函数

//参数1,timer编号//参数2,timer的扫描周期//参数3,timer回调函数SetTimer(1, 200, NULL);

2,Thread
1),创建线程
方法1:系统API函数
CreateThread函数
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa,DWORD
cbStack,LPTHREAD_START_ROUTINE lpStartAddr,LPVOID lpvThreadParam,DWORD fdwCreate, LPDWORD lplDThread)
参数:
lpsa = 线程安全属性,可以为NULL
cbStack = 线程栈的最大大小,该参数可以忽略
lpStartAddr=线程函数
lpvThreadParam=向线程函数创建的参数
fdwCreate=线程创建标记(此值=CREATE_SUSPENDED,线程创建后即被挂起,此值=STACK_SIZE_PARAM_IS_A_RESERVATION表示cbStack 参数将不被忽略,cbStack 为线程栈的最大大小)
lplDThread=线程的指针
返回值:函数执行成功,返回线程句柄,否则返回NULL

//.....{    HANDLE  m_Thread=CreateThread(NULL,0,ThreadFun,this,0,NULL);}//......DWORD  _stdcall  ThreadFun(LPVOID lpParam){    //.....线程执行,线程函数必须声明为静态函数(类内部)或者全局函数}//......//头文件声明//static DWORD  _stdcall  ThreadFun(LPVOID lpParam);

1-1),挂起线程
DWORD SuspendThread(HANDLE hThread)
参数:
hThread=线程句柄

    if (m_Thread)    SuspendThread(m_Thread);

1-2),重新启动挂起的线程
DWORD ResumeThread(HANDLE hThread)
参数:
hThread=线程句柄

    if(m_Thread)    ResumeThread(m_Thread);

1-3),结束当前线程
VOID ExitThread(DWORD dwExitCode)
参数:
dwExitCode=线程退出代码

1-4),终止当前线程
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode)
参数:
hThread=线程句柄
dwExitCode=线程退出代码

    if(m_Thread)    TerminateThread(m_Thread,0);

方法2:C++函数(需要包含process.h头文件)<没有测试>
_beginthreadex函数
uintptr_t _beginthreadex(void * security,unsigned stack_size ,unsigned (start_address)(void ),void * arglist,unsigned initflag,unsigned *thrdaddr)
security=线程安全属性信息,为NULL表示线程句柄不被子进程继承
stack_size=线程栈的大小
start_address=线程函数
arglist=线程函数的参数
initflag=线程初始化标记,值=0,则立即被执行,值=CREATE_SUSPENDED,线程创建后被挂起
thrdaddr=线程ID,整型指针

方法3:MFC函数
AfxBeginThread函数
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0,
DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
参数:
pfnThreadProc=线程函数指针(原型UINT ThreadProc(LPVIOD pThreadParam))
pParam=线程函数的参数
nPriority =线程的优先级
nStackSize =线程栈的大小
dwCreateFlags =线程创建标记
lpSecurityAttrs =线程安全属性

3,死循环线程关闭
3-1,添加一个事件变量

BOOL m_bExit;CEvent m_EventExit;

3-2,在线程函数中添加处理代码

while(true){    if(m_bExit)    {           break;    }    //...............}m_EventExit.SetEvent();

3-3,在退出函数中,等待线程退出

if (WAIT_OBJECT_0 == WaitForSingleObject(m_EventThreadExited, INFINITE)){    //删除线程}