1、 MFC中有两类线程,分别称之为工作者线程和用户界面线程。
二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。
用户界面线程和工作者线程都是由AfxBeginThread创建的。现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一个用于工作者线程,分别有如下的原型和过程:
用户界面线程的AfxBeginThread
用户界面线程的AfxBeginThread的原型如下:
CWinThread* AFXAPI AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority,
UINT nStackSize,
DWORD dwCreateFlags,
LPSECURITY_ATTRIBUTES lpSecurityAttrs)
其中:
参数1是从CWinThread派生的RUNTIME_CLASS类;
参数2指定线程优先级,如果为0,则与创建该线程的线程相同;
参数3指定线程的堆栈大小,如果为0,则与创建该线程的线程相同;
参数4是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。
参数5表示线程的安全属性,NT下有用。----引自:点击打开链接
2、多参数传入线程,一般有两种方式:
方法一:定义全局结构体,在线程函数内直接调用。
struct Sok //结构体
{
SOCKET s;
SOCKADDR_IN addrClient;
int len;
};
Sok sok_test ;//结构体声明
static UINT whileass()//全局结构体传入参数。
{
while(s_d=accept(sok_test.s,(sockaddr*)&sok_test.addrClient,&sok_test.len))
{
AfxBeginThread((AFX_THREADPROC)Open,(LPVOID)IDC_BUTTON1,0,0,0,0);
}
return 0;
}
AfxBeginThread((AFX_THREADPROC)whileass,(LPVOID)IDC_BUTTON1,0,0,0,0);//调用whileass函数
2、利用 AfxBeginThread自带方法传入参数,然后进行类型转换。
如:
DWORD WINAPI ThreadProc(LPVOID pParam)//利用mfc AfxBeginThread自带方法传入参数
{
Sok rect=*(Sok*)pParam;
while(s_d=accept(rect.s,(sockaddr*)&rect.addrClient,&rect.len))
{
AfxBeginThread((AFX_THREADPROC)Open,(LPVOID)IDC_BUTTON1,0,0,0,0);
}
return 0;
}
AfxBeginThread((AFX_THREADPROC)ThreadProc,&_sok,THREAD_PRIORITY_IDLE);//调用ThreadProc