使用 AfxBeginThread 传递一个结构体入线程需要注意的地方

//定义一个结构体,以便传递给线程

struct FileInfo

{

DWORD filesize;

long received;

};


FileInfo m_FileInfo; //声明一个对象


AfxBeginThread(UpdateProgressThread,(LPVOID)&m_FileInfo,THREAD_PRIORITY_HIGHEST); //UpdateProgressThread为线程函数


//注意要传递一个结构体进来,参数必须只能是一个,且是LPVOID类型,也就是接收任何类型的参数

UINT CShanLingDlg::UpdateProgressThread(LPVOID lParam)

{

 FileInfo* tis = (FileInfo*)lParam;

 ......

}


//在类的头文件中注意把线程函数设置为静态的,因为AfxBeginThread只接受普通函数,而不接收类的成员函数,定义为静态的,不需要定义实例化对象就可以直接调用。(C++11中的线程类就不限制这一点。)

static UINT UpdateProgressThread(LPVOID lParam);


如果要是静态函数里使用

::PostMessage(this->m_hWnd,WM_USER_THREAD_SVRDOWN_UPDATE_PROGRESS, (WPARAM)filesize, (LPARAM)temp1);的话则会报错,在静态函数里头不能使用this指针。


我们可以定义一个全局的句柄

HWND hwnd;

在类的OnInitDialog() 函数里添加

hwnd=this->m_hWnd;

此时再引用即可。

::PostMessage(hwnd,WM_USER_THREAD_SVRDOWN_UPDATE_PROGRESS, (WPARAM)filesize, (LPARAM)temp1);



你可能感兴趣的:(线程,传递,结构体,AfxBeginThread)