概述
用VS2013+MFC编程,在做数据加载处理过程中经常需要多线程,否则程序容易卡死。首先windows多线程可以分为UI多线程和处理多线程:UI多线程继承来自CWinThread类,主要作用是创建UI界面;这里主要讲后台数据处理多线程的使用,即使用Win32 提供的一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。
1 建立多线程:
首先建立MFC对话框工程,在对话框类Dlg类中声明两个参数,分别是
HANDLEhThread;// 线程的句柄
DWORDThreadID;// 线程的ID,竟然不用初始化,应该是自动分配的吧
然后在类外声明全局函数,函数类型一般为UINT ,即
UINT ThreadProc(LPVOID pParam);//参数pParam为结构体指针,指向你要传到线程中
//的参数,由于此函数是全局函数,所以指针最好是全局的
这个函数在不需要传递指着时,可以忽略pParam,需要传递时参考下面第2部分的线程参数传递。
最后在你需要的地方,也就是Dlg.cpp中的函数来建立线程:
hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)Thread_progress,//需要执任务,不需要括号
NULL,//这里在需要传参数的时候是一个指针
0,
&ThreadID);//线程的ID
2线程传递参数;
大多时候的线程是需要你传递一些参数进去的,否则线程函数本身是一个全局函数,你MFC中的一些控件和参数不能直接使用,这些参数就以结构体的指针的形式进行传递。
首先在Dlg.h中建立结构体:
Struct MessageParam
{
Intmesg1;//用来传递普通类型
CProgressCtrl*progress;//也可以用来传递控件对象指针
}
然后直接在Dlg.cpp中声明全局变量,局部变量也应该可以。
MessageParam m_param;
在建立线程函数之前,即hThread = CreateThread(。。。)之前,把参数m_param中的内容初始化,然后再建立线程:
hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProc,//需要执任务,不需要括号
&m_param,//这里传递了一个指针,就是需要传递的参数给了子线程
0,
&ThreadID);//线程的ID
最重要的是,参数传递给了函数ThreadProc(LPVOID pParam),所以这个函数就需要把传来的参数利用起来,如下:
ThreadProc(LPVOID pParam)
{//首先进行强制转换,把LPVOID类型转换成你需要的格式,
MessageParam* mp=( MessageParam*) pParam;
//通过这句转换就可以使用mp中的参数了
}
3线程挂起和恢复
这里只是介绍两个函数,
SuspendThread(hThread);//线程暂停
ResumeThread(hThread);//线程恢复
4线程的终结,
CloseHandle(hThread);//
这个函数将此句柄的线程close,但线程不会立即消失,而是在完成线程任务后清理出内存来
注意事项:多线程种最麻烦的是多个线程同时访问一个文件或对参数进行修改,由于cpu多线程是将时间片分给不同的线程执行,所以就会产生冲突或者数据已经被线程A修改了,但线程B却不知道的情况,这就需要线程锁;还有就是一个线程需要修改UI线程中的显示内容时,需要通过MFC消息传递机制才能保证安全问题,针对这两个问题,我会在以后遇到的时候再记录下来,大家可以参考MSND。
最后
以上就是超级大树为你收集整理的MFC+多线程+参数传递的全部内容,希望文章能够帮你解决MFC+多线程+参数传递所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复