线程启动,Visual C++报告Access vilovation
编号:QA002420
建立日期: 2000年1月11日 最后修改日期:2000年9月7日
所属类别:
seacloud:
操作系统:win9x
编程工具:visual c++
问题:一个基于对话框的程序,在其对话框类中加入了CSocket类的对象sock作为成员变量。我现在想启动一个线程管理这个CSocket对象,用于从网络上取数据并在列表框中显示,程序片段大致如下:
CMyDlg::readsock(){
char tmp[1024];
memset(tmp,0,sizeof(tmp));
sock.Receive(tmp,1024); /////((*))///
..........
}
CMydlg::OnbuttonOK(){
AfxBeginThread(mythread,m_pWnd);
}
UINT mythread(LPVOID param){
CWnd *pwnd=CWnd::FromHandle((HWND)param));
while(1)
(CMydlg*)pwnd->readsock();
exit(0);
}
可是线程一启动,visual c++就说(*)处access vilovation.请问错误原因是什么如何解决?谢谢。
回答:
函数使用好象有问题:
CMydlg::OnbuttonOK(){
AfxBeginThread(mythread,m_pWnd);
}
应该改为 AfxBeginThread(mythread,&m_hWnd,
THREAD_PRIORITY_BELOW_NORMAL,
0,
CREATE_SUSPENDED);
试试。
happyhorse的意见:
CSocket类是不支持同步的,特别是在多线程 中是很难使用的,这是MFC的问题,所以在高效率的通信中,最好用Socket的API,你也不必这样读Socket的数据,只要重载OnReceive()函数,在OnReceive()中读即可。
此问题由苗凯回答。
| |
|
|
| |
|
|