MFC+多线程+参数传递

用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。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页