MFC学习笔记-线程

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))
{
    //删除线程
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值