多线程编程问题!
代码如下:
char MyStr[]= "We are using work thead now ! ";
char UpperStr[]= "We are using thread now ! ";
void CTestThreadView::OnWorkthread()
{
// TODO: Add your command handler code here
CDC *pDC=GetDC();
pDC-> TextOut(20,20, "转换前的字符串为: ");
pDC-> TextOut(40,60,MyStr);
//char *pString;
char * pParam;
//pString=(char *)UpperStr;
pParam=(char *)UpperStr;
//启动工作线程,MyWorkThread是线程函数
AfxBeginThread(MyWorkThread,(LPVOID)pParam);
pDC-> TextOut(20,100, "转换后的字符串为: ");
pDC-> TextOut(40,140,UpperStr);
ReleaseDC(pDC);
}
UINT MyWorkThread(LPVOID pParam)
{
CWnd * pMainWnd=AfxGetMainWnd();
if (pParam==NULL)
{
::MessageBox(pMainWnd-> m_hWnd, "参数传递出错,线程结束! ", "Thread error ",
MB_OK | MB_ICONERROR);
AfxEndThread(2);
}
char * pStr=(char *)pParam;
while (* pStr)
{
if(*pStr> = 'a ' && *pStr <= 'z ')
*pStr-=32;
pStr++;
}
::MessageBox(pMainWnd-> m_hWnd,(const char *)pParam, "Thread run ",MB_OK);
return 0;
}
但提示有错误:
D:\c++编程结果\TestThread\TestThreadView.cpp(227) : error C2665: 'AfxBeginThread ' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *) '
哪位知道为什么阿?
[解决办法]
使用AfxBeginThread启动线程时,其第二个参数必须是LPVOID类型,即一个指向Void类型的指针,所以传递的参数也应该是相同的类型,而HWND实质为一个整数,所以要使用这个参数应该这样使用:AfxBeginThread(BounceProc,(LPVOID)(&hWnd));
然后在函数BounceProc的内部的第一句语句使用强制类型转换读取参数:
HWND hwndTemp = (HWND)(*pParam);
AfxBeginThread使用LPVOID的原因是使模块间可以传递多个的参数,比如pParam可以是一个指向结构体的指针,在函数内部强制转换后就相当于传递了多个参数。