VC学习笔记10多线程
来源:互联网 发布:win10 python环境搭建 编辑:程序博客网 时间:2024/06/05 20:47
现在开始多线程编成
在创建新的线程后,新线程的程序是和主线程程序并行执行的
创建一个MFC程序,这里我创建了一个EDIT变量m_edit
并在对话框类CXctestDlg中定义线程的句柄
HANDLE m_hThread;
在所需调用创建线程处加入
m_hThread=CreateThread(NULL,0,ThreadProc,this,0,NULL);
然后定义线程处理函数ThreadProc:
DWORD __stdcall ThreadProc(LPVOID lp) //这个参数的类型唯一
{
CXctestDlg *dlg=(CXctestDlg*)lp;
CString str;
for(int i=0;i<999999;i++)
{
str.Format("%d",i);
dlg->m_edit.SetWindowText(str);
dlg->m_edit.Invalidate();
}
return 0;
}
这个程序的功能是当按下按钮,遍及框的数字自动显示增加,当然这不会影响主对话框的操作,因为他们在不同的线程并行执行。
下面看看CreateThread各个参数:
CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //表示线程对象的安全属性,一般为NULL
DWORD dwStackSize, //线程栈空间的大小,如果输入为0则为默认大小1MB
LPTHREAD_START_ROUTINE lpStartAddress, //线程执行函数地址,多线程可以用同一个地址
LPVOID lpParameter, //参数传给线程函数的参数
DWORD dwCreationFlags, //指定额外的标志来控制线程的创建,为0表示线程创建后立即调度
LPDWORD lpThreadId //返回线程ID号,为NULL不需要返回
);
挂起线程:
SuspendThread(m_hThread); //暂停的作用
唤醒线程:
ResumeThread(m_hThread); //解除暂停作用
强迫中止线程:
TerminateThread(m_hThread);
线程同步
当多线程一起操作一个全局变量时会产生冲突,因此需要线程同步
事件驱动同步:
定义一个全局变量
HANDLE hEvent; //事件句柄
分别在每一个线程中加入
WaitForSingleObject(hEvent.INFINITE);
... //操作
SetEvent(hEvent);
在线程创建部分加入
hEvent=CreateEvent(NULL,FALSE,TRUE,"event");
效果:
每个线程只能在hEvent被设置后才会调用
当hEvent未被设置,WaitForSingleObject(hEvent.INFINITE)这句就是
等待直到hEvent被设置,一旦hEvent被设置,这个函数才会结束,函数
结束时自动将hEvent改为未设置,然后执行下面的程序,后面SetEvent(hEvent)
就是重新设置hEvent。
下面介绍另一种方法
在对话框类中加入
CWinThread *m_pThread;
在所需要响应线程的按钮中加入
m_pThread=AfxBeginThread(ThreadFun,this,0,0,0,NULL);
线程处理函数
UINT ThreadFun(LPVOID pTh)
{
...return 0;
}
在所需要结束线程的地方,这边我有一个按钮强制结束,响应代码如下
DWORD dwexit=0;
if(m_pThread!=NULL) //如果线程已经结束那么就是NULL了
{
GetExitCodeThread(m_pThread,&dwexit); //把线程的运行状态给dwexit
if(dwexit==STILL_ACTIVE)
TerminateThread(m_pThread,0); //强制终止
delete m_pThread;
}
在创建新的线程后,新线程的程序是和主线程程序并行执行的
创建一个MFC程序,这里我创建了一个EDIT变量m_edit
并在对话框类CXctestDlg中定义线程的句柄
HANDLE m_hThread;
在所需调用创建线程处加入
m_hThread=CreateThread(NULL,0,ThreadProc,this,0,NULL);
然后定义线程处理函数ThreadProc:
DWORD __stdcall ThreadProc(LPVOID lp) //这个参数的类型唯一
{
CXctestDlg *dlg=(CXctestDlg*)lp;
CString str;
for(int i=0;i<999999;i++)
{
str.Format("%d",i);
dlg->m_edit.SetWindowText(str);
dlg->m_edit.Invalidate();
}
return 0;
}
这个程序的功能是当按下按钮,遍及框的数字自动显示增加,当然这不会影响主对话框的操作,因为他们在不同的线程并行执行。
下面看看CreateThread各个参数:
CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //表示线程对象的安全属性,一般为NULL
DWORD dwStackSize, //线程栈空间的大小,如果输入为0则为默认大小1MB
LPTHREAD_START_ROUTINE lpStartAddress, //线程执行函数地址,多线程可以用同一个地址
LPVOID lpParameter, //参数传给线程函数的参数
DWORD dwCreationFlags, //指定额外的标志来控制线程的创建,为0表示线程创建后立即调度
LPDWORD lpThreadId //返回线程ID号,为NULL不需要返回
);
挂起线程:
SuspendThread(m_hThread); //暂停的作用
唤醒线程:
ResumeThread(m_hThread); //解除暂停作用
强迫中止线程:
TerminateThread(m_hThread);
线程同步
当多线程一起操作一个全局变量时会产生冲突,因此需要线程同步
事件驱动同步:
定义一个全局变量
HANDLE hEvent; //事件句柄
分别在每一个线程中加入
WaitForSingleObject(hEvent.INFINITE);
... //操作
SetEvent(hEvent);
在线程创建部分加入
hEvent=CreateEvent(NULL,FALSE,TRUE,"event");
效果:
每个线程只能在hEvent被设置后才会调用
当hEvent未被设置,WaitForSingleObject(hEvent.INFINITE)这句就是
等待直到hEvent被设置,一旦hEvent被设置,这个函数才会结束,函数
结束时自动将hEvent改为未设置,然后执行下面的程序,后面SetEvent(hEvent)
就是重新设置hEvent。
下面介绍另一种方法
在对话框类中加入
CWinThread *m_pThread;
在所需要响应线程的按钮中加入
m_pThread=AfxBeginThread(ThreadFun,this,0,0,0,NULL);
线程处理函数
UINT ThreadFun(LPVOID pTh)
{
...return 0;
}
在所需要结束线程的地方,这边我有一个按钮强制结束,响应代码如下
DWORD dwexit=0;
if(m_pThread!=NULL) //如果线程已经结束那么就是NULL了
{
GetExitCodeThread(m_pThread,&dwexit); //把线程的运行状态给dwexit
if(dwexit==STILL_ACTIVE)
TerminateThread(m_pThread,0); //强制终止
delete m_pThread;
}
0 0
- VC学习笔记10多线程
- VC多线程编程学习笔记(一)
- VC多线程编程学习笔记(二)
- 学习笔记二,vc++创建多线程服务器
- 孙鑫VC学习笔记:多线程编程
- vc++学习笔记10
- 学习笔记二,vc++创建多线程服务器(二)
- 学习笔记二,vc++创建多线程服务器(三)
- 学习笔记二,vc++创建多线程服务器(四)
- 《VC++深入详解》学习笔记 第十五章 多线程
- VC 多线程学习
- VC多线程学习
- VC++技术内幕』学习笔记(10)
- VC++学习笔记1
- VC++学习笔记2
- VC学习笔记
- VC++ 学习笔记(-)
- VC++ 学习笔记(二)
- 设计模式 原型模式与C++ & 设计模式的思考
- C++虚函数及虚函数表解析
- 浅析Lua中table的遍历
- Office For Mac 2016安装与破解
- LTView(定义一个视图的类,相当于C中的函数)
- VC学习笔记10多线程
- mysql慢查询日志
- 函数返回类型为指针类型时
- OC学习笔记09--OC中内存管理的ARC机制
- error C4430: 缺少类型说明符 - 假定为 int
- iOS 7 导航 路线
- 使用Xcode和Instruments调试解决iOS内存泄露
- KMP字符串匹配算法
- scp - SSH远程文件/目录传输命令