zl程序教程

您现在的位置是:首页 >  其他

当前栏目

MFC-多线程

2023-04-18 15:44:02 时间

 方法一:CreateThread 

一般在WIN32环境下使用

DWORD WINAPI func(LPVOID lpParam)//线程函数
//注意格式
{
    int n = (int)lpParam;
    CString str;
    str.Format(_T("n=%d"),n);
    AfxMessageBox(str);

    return 0;
}

void CduoxiancenDlg::OnBnClickedButton1()
{
    DWORD ID = 0;
    HANDLE thread = CreateThread(NULL, 0, func, (LPVOID)123, 0, &ID);
        /*
        参数1:设为NULL
        参数2:设置初始栈的大小,以字节为单位,如果为0,那么使用默认栈空间大小(1M)
        参数3: 线程函数的指针
        参数4:LPVOID 向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL
        参数5:线程标志,可取值如下
                CREATE_SUSPENDED(0x00000004):创建一个挂起的线程
                0:表示创建后立即激活
        参数6:DWORD 保存新线程的id。如果不需要可以NULL
        返回值:函数成功,返回线程句柄;函数失败返回false。若不想返回线程ID,设置值为NULL
        说明:线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象

        */

    BOOL b=CloseHandle(thread);//关闭线程
    //参数:线程句柄
    //返回值:TRUE:执行成功;FALSE:执行失败,可以调用GetLastError()获知失败原因

}

 

方法二:AfxBeginThread--推荐

一般在MFC环境下使用

功能是创建用户界面线程和工作者线程 

工作线程:与界面没有关系的线程

UINT func1(LPVOID pParam)   //线程函数
//注意格式
    {
    int n = (int)pParam;
    CString str;
    str.Format(_T("n=%d"),n);
    AfxMessageBox(str);

    return 0;
    }


void CduoxiancenDlg::OnBnClickedButton2()
{
    //AfxBeginThread线程会自动释放

    CWinThread* pp= AfxBeginThread(func1,LPVOID(456),0,0,0,NULL);//创建工作线程
    //工作线程与界面没有关系
    /*
    参数1:线程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为NULL
    参数2:传递到线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程
    参数3:线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级
    参数4:新创建的线程的栈的大小.如果为 0,使用默认大小(1M)
    参数5:CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用:ResumeThread
           0 : 创建线程后就开始运行
    参数6:指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性.
           如果为 NULL,那么新创建的线程就具有和主线程一样的安全性
    
    返回值: 成功时返回一个指向新线程的线程对象的指针,否则NULL

    如果要在线程内结束线程,可以在线程内调用 AfxEndThread.
    
    */


    pp->m_hThread;//线程句柄
    pp->m_nThreadID;//当前线程的 ID
    pp->m_bAutoDelete;//值为1时(默认),线程终止时自动销毁对象

    

}

 

 

 

 

 

 

 

 

在线程函数中调用类成员变量和类成员函数

 

 

UINT func1(LPVOID pParam)   
    {
    
    CduoxiancenDlg* p = (CduoxiancenDlg*)pParam;
    //创建主对话框的指针=类指针
    
    int n = p->tt;
    CString s = p->str; 
    //获取类成员变量
    ::OutputDebugString(s);

    int nn = p->add(2,30);
    //调用类成员函数

    s.Format(_T("nn=%d"), nn);
    ::OutputDebugString(s);
        
    return 0;
    }


void CduoxiancenDlg::OnBnClickedButton2()
{
    
    tt = 300;
    str = _T("祖国万岁");
    CWinThread* pp= AfxBeginThread(func1,this,0,0,0,NULL);
    //参数2传递的是类指针
            

}

int CduoxiancenDlg::add(int a, int b)
{
    return a+b;
}

 

 

 

方式三:_beginthreadex 

一般在c、c++ 环境中使用