平时在MFC里使用多线程时其实是很方面的,因为微软提供了一个API让我们很方面的去创建线程:下面是MSDN中关于CreateThread的函数原型:
1、函数原型声明:
The CreateThread function creates a thread to execute within the virtual address space of the calling process.
To create a thread that runs in the virtual address space of another process, use the CreateRemoteThread function.
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
2、参数说明:
dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为Nil。
dwCreationFlags :线程标志,可取值如下
CREATE_SUSPENDED: 创建一个挂起的线程
0 :创建后立即激活。
lpThreadId:保存新线程的id。
3、返回值:
函数成功,返回线程句柄;函数失败返回false。
4、实例代码:
A、新建一个对话框工程为MFC,在MFCDlg.h添加两个成员函数,注意一定要是静态的,代码如下:
class CMFCDlg : public CDialog
{
// Construction
public:
CMFCDlg(CWnd* pParent = NULL); // standard constructor
// 线程B1、B2函数
static DWORD WINAPI ThreadB1(LPVOID lpParam);
static DWORD WINAPI ThreadB2(LPVOID lpParam);
......
}
B、在cpp文件中实现函数,添加代码如下:
// 申请空间
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
ZeroMemory(&si,sizeof(STARTUPINFO));
// 设置进程启动属性
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
si.cbReserved2 = NULL;
si.lpReserved2 = NULL;
bRet = CreateProcess(_T("C://Program Files//Internet Explorer//IEXPLORE.exe"),
_T("http://www.coderfans.cn"),
NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
return 0;
}
DWORD WINAPI CMFCDlg::ThreadB2(LPVOID lpParam)
{
// 定义结构对象
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL bRet;
// 申请空间
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
ZeroMemory(&si,sizeof(STARTUPINFO));
// 设置进程启动属性
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
si.cbReserved2 = NULL;
si.lpReserved2 = NULL;
bRet = CreateProcess(_T("C://Program Files//Internet Explorer//IEXPLORE.exe"),
_T("http://blog.csdn.net/wangningyu"),
NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
return 0;
}
C、然后在对话框初始化时创建进程即可,代码如下:
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
DWORD dw1,dw2;
CreateThread(NULL,0,ThreadB1,NULL,0,&dw1);
Sleep(100);
CreateThread(NULL,0,ThreadB2,NULL,0,&dw2);
Sleep(100);
return TRUE; // return TRUE unless you set the focus to a control
}
5、MFC创建多线程完成,就这么简单咯!