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))
{
//删除线程
}