热情软件屋

 

线程启动,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()中读即可。

此问题由苗凯回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio