线程问题

smdszgzh 2009-04-01 10:01:14
我想在单击一个按钮时创建一个纯种,然后在线程里做这些事

UINT CMySerSocketDlg::ThreadSerFuc(LPVOID pParam)//线程函数,在头文件中已声明
{
WSADATA m_data;
CString m_Msg,mMsg1;
CWnd *hwnd=GetDlgItem(IDC_EDIT);
if(WSAStartup(MAKEWORD(2,2),&m_data)!=0)
{
m_Msg="Load Socket Library failed!";
hwnd->SetWindowText(m_Msg);
return -1;

}

m_Msg="ff";
hwnd->SetWindowText(m_Msg);
SOCKET SerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
SOCKET CliSocket;
if(INVALID_SOCKET==SerSocket)
{
m_Msg="Create Socket Failed!";
hwnd->SetWindowText(m_Msg);
return -1;
}
sockaddr_in Seraddr,Cliaddr;
Seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
Seraddr.sin_family=AF_INET;
Seraddr.sin_port=htons(8000);
bind(SerSocket,(sockaddr*)&Seraddr,sizeof(Seraddr)+1);
int n=listen(SerSocket,5);
if(n==SOCKET_ERROR)
{
m_Msg="Listen failed!";
hwnd->SetWindowText(m_Msg);
return -1;
}
// m_Msg="服务器已启动,等待用户连接!";
// hwnd->SetWindowText(m_Msg);
CWnd *hwnd1=GetDlgItem(IDC_EDIT1);
while(true)
{
int m=sizeof(Cliaddr);
CliSocket=accept(SerSocket,(sockaddr*)&Cliaddr,&m);
char *recBuff=new char[100];
char *sendBuff=new char[100];
int length=_msize(recBuff);
sendBuff="Wellcom!";
send(CliSocket,sendBuff,length+1,0);
m_Msg=sendBuff;
hwnd->SetWindowText(m_Msg);
while(true)
{
recv(CliSocket,recBuff,length+1,0);
if(recBuff[0]=='q'||recBuff[0]=='Q')
{
m_Msg="用户请求退出!";
hwnd->SetWindowText(m_Msg);
return -1;
}
m_Msg=recBuff;
hwnd->SetWindowText(recBuff);
hwnd1->GetWindowText(mMsg1);
recBuff=mMsg1.GetBuffer(mMsg1.GetLength());
send(CliSocket,sendBuff,length+1,0);
mMsg1.ReleaseBuffer();
//mMsg1="";
}

}
closesocket(SerSocket);
WSACleanup();
}

void CMySerSocketDlg::OnSet()
{
AfxBeginThread(ThreadSerFuc,NULL);//创建一个线程,不知道如何传递参数了

// TODO: Add your control notification handler code here

}



提示错误 none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'
我不知道怎么传递这个参数了,请高手指教,还有VC6里如果让代码对齐??
...全文
79 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2009-04-01
  • 打赏
  • 举报
回复
线程函数中不能直接取CWnd::GetDlgItem,你可以在线程函数的参数LPVOID中传递CMySerSocketDlg*
fishion 2009-04-01
  • 打赏
  • 举报
回复
把 UINT ThreadSerFuc(LPVOID pParam)方法定义到外面,当你用的时候就难它传入一个窗口句柄hwnd,调用GetDlgItem时就用hwndctrl= ::GetDlgItem(hwnd,IDC_EDIT),::SetWindowText(hwndctrl,m_Msg);
smdszgzh 2009-04-01
  • 打赏
  • 举报
回复
还是不行,会出更多问题
error C2724: 'ThreadSerFuc' : 'static' should not be used on member functions defined at file scope
E:\My project\MySerSocket\MySerSocketDlg.cpp(181) : error C2352: 'CWnd::GetDlgItem' : illegal call of non-static member function
c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(1992) : see declaration of 'GetDlgItem'
E:\My project\MySerSocket\MySerSocketDlg.cpp(214) : error C2352: 'CWnd::GetDlgItem' : illegal call of non-static member function
c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(1992) : see declaration of 'GetDlgItem'
执行 cl.exe 时出错.
oyljerry 2009-04-01
  • 打赏
  • 举报
回复
static UINT CMySerSocketDlg::ThreadSerFuc(LPVOID pParam)
smdszgzh 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]
ThreadSerFuc 定义成静态成员函数
[/Quote]
static UINT ThreadSerFuc(LPVOID pParam)??
smdszgzh 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]
ThreadSerFuc 定义成静态成员函数
[/Quote]
static UINT ThreadSerFuc(LPVOID pParam)??
oyljerry 2009-04-01
  • 打赏
  • 举报
回复
ThreadSerFuc 定义成静态成员函数
  • 打赏
  • 举报
回复
原型:
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

把这个:
AfxBeginThread(ThreadSerFuc,NULL);//创建一个线程,不知道如何传递参数了

改为:
AfxBeginThread(ThreadSerFuc, 0, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
smdszgzh 2009-04-01
  • 打赏
  • 举报
回复
'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'
fandh 2009-04-01
  • 打赏
  • 举报
回复
是那句出错?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧