MFC AfxBeginThread 多参数处理

来源:互联网 发布:淘宝网非凡服饰 编辑:程序博客网 时间:2024/06/14 20:30

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



0 0