AfxBeginThread()使用时报错,麻烦各位看看是怎么回事?

时间:2022-07-02 17:32:58
在OnBnClickedOk()中启动线程P1(),P1无参数。代码如下,报错。怎样解决?如果P1()带参数int x,又该如何修改? 

void CProgressBarDlg::OnBnClickedOk() 

 // TODO: 在此添加控件通知处理程序代码 
 //OnOK(); 
 int *x; 
 AfxBeginThread(P1,this); 


void P1() 

 CProgressBarDlg *pDLG=(CProgressBarDlg *)(AfxGetApp()->GetMainWnd()); 
 //Progress为一进度条 
 pDLG->Progress.SetStep(1); 
 pDLG->Progress.SetPos(100); 
 for (int i=100;i>=0;i--) 
 { 
  pDLG->Progress.SetPos(i); 
  Sleep(100); 
 } 
}

另外,
AfxBeginThread(P1,this); 
改为 
AfxBeginThread(P1,NULL); 
也不行。 
我用的是Visual Studio 2008,编译时错误提示: 
1>d:\我的文档\visual studio 2008\projects\progressbar\progressbar\progressbardlg.cpp(166) : error C2665: “AfxBeginThread”: 2 个重载中没有一个可以转换所有参数类型 
1> d:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(4535): 可能是“CWinThread *AfxBeginThread(AFX_THREADPROC,LPVOID,int,UINT,DWORD,LPSECURITY_ATTRIBUTES)” 
1> d:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(4538): 或 “CWinThread *AfxBeginThread(CRuntimeClass *,int,UINT,DWORD,LPSECURITY_ATTRIBUTES)” 
1> 试图匹配参数列表“(void (__cdecl *)(void), LPVOID)”时

6 个解决方案

#1


P1函数与AfxBeginThread的要求不符。
UINT P1(LPVOID pParam)
{
return 0;
}

#2


谢谢!解决了。
那么如果要将参数int x带入线程函数应该怎样做呢?比如我想在线程中sleep(x);?

#3


强制类型转换就可以:
AfxBeginThread(P1, (PVOID)(INT_PTR)i);

UINT P1(LPVOID pParam) 
{
Sleep(DWORD(DWORD_PTR)pParam);
return 0; 
}

#4


谢谢!完全解决了。

#5


解决了?你只解决了编译错误吧?窗口不能跨线程使用,你在P1里使用对话框主窗口是错误的

#6


事实上程序是正确的运行了。主窗体上的进度条确实是按照原先的设想在动。我的窗体上一共有3个进度条,现在启动三个进程,可以以三个不同的速度滚动。

#1


P1函数与AfxBeginThread的要求不符。
UINT P1(LPVOID pParam)
{
return 0;
}

#2


谢谢!解决了。
那么如果要将参数int x带入线程函数应该怎样做呢?比如我想在线程中sleep(x);?

#3


强制类型转换就可以:
AfxBeginThread(P1, (PVOID)(INT_PTR)i);

UINT P1(LPVOID pParam) 
{
Sleep(DWORD(DWORD_PTR)pParam);
return 0; 
}

#4


谢谢!完全解决了。

#5


解决了?你只解决了编译错误吧?窗口不能跨线程使用,你在P1里使用对话框主窗口是错误的

#6


事实上程序是正确的运行了。主窗体上的进度条确实是按照原先的设想在动。我的窗体上一共有3个进度条,现在启动三个进程,可以以三个不同的速度滚动。