UINT RecvBroadCast(LPVOID lpPram)
{
BroadcastRecvPram *pInfoSrc=(BroadcastRecvPram *)lpPram;
BroadcastSendPram recvData;
CListCtrl *list=pInfoSrc->pListCtrl;
BOOL *bIsContinue=pInfoSrc->pIsRecvBroadcast;
WORD wVersion=MAKEWORD(1,1);
WSADATA data;
SOCKET sockSrv;
SOCKADDR_IN addrSrv;
BOOL bIsBroadCast;
int iLen=sizeof(SOCKADDR_IN);
SOCKADDR_IN addrRecv;
char szName[100];
PHOSTENT hostinfo;
CString addrIp;
CString userAddr;
int iCount;
int i=0; LVFINDINFO info;

info.flags = LVFI_PARTIAL|LVFI_STRING; gethostname(szName,100);
hostinfo=gethostbyname(szName);
addrIp=inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
// AfxMessageBox(addrIp); WSAStartup(wVersion,&data);
sockSrv=socket(AF_INET,SOCK_DGRAM,0);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=2000;
addrSrv.sin_addr.S_un.S_addr=inet_addr(addrIp);
setsockopt(sockSrv,SOL_SOCKET ,SO_BROADCAST,(char *)&bIsBroadCast,4);
bind(sockSrv,(SOCKADDR *)&addrSrv,iLen);
while (*bIsContinue)
{
iCount=recvfrom(sockSrv,(char *)&recvData,sizeof(recvData),0,(SOCKADDR *)&addrRecv,&iLen);
if (iCount)
{
info.psz = recvData.szName;
if (list->FindItem(&info)==-1)
{
list->InsertItem(0,recvData.szName);
list->SetItemText(i,1,recvData.addrIp);
i++;
}

}
}
closesocket(sockSrv);
return 300;
}
这是一个线程处理函数,list是主窗口里面和List Contrl关联的变量,当我在OnDestroy里面把成员变量置FALSE,就变成非法退出了???
另一个线程没传入List Contrl关联的变量就没事,请问这是怎么回事???

解决方案 »

  1.   

    补上
    struct BroadcastRecvPram 
    {
      CListCtrl pListCtrl;
      BOOL * pIsRecvBroadcast;
    };
      

  2.   

    Detected memory leaks!
    Dumping objects ->
    strcore.cpp(118) : {86} normal block at 0x00384940, 24 bytes long.
     Data: <            192.> 01 00 00 00 0B 00 00 00 0B 00 00 00 31 39 32 2E 
    thrdcore.cpp(166) : {75} client block at 0x00384E38, subtype 0, 112 bytes long.
    a CWinThread object at $00384E38, 112 bytes long
    Object dump complete.
    The thread 0x32C has exited with code 2 (0x2).
    The thread 0x574 has exited with code 2 (0x2).
      

  3.   

    假如是因为网络阻塞造成线程不安全退出,我试过让该线程return之后再delete,结果还是不行
      

  4.   

      CListCtrl *list=pInfoSrc->pListCtrl;
    struct BroadcastRecvPram
    {
      CListCtrl pListCtrl;
      BOOL * pIsRecvBroadcast;
    };你取listctrl错误了, 你的结构里定义的是对象, 取得时候应该 用 & .
      

  5.   

    struct BroadcastRecvPram
    {
      CListCtrl pListCtrl;
      BOOL * pIsRecvBroadcast;
    };
    这里的pListCtrl应该定义成指针的形式,赋值的时候指向主窗口里面的list。
    MFC中类变量和窗口是分开的,其实你可以传值的时候直接用&取主窗口里面的list赋值过去。在线程中这样处理
    CListCtrl *p = (CListCtrl *lpPram);
    用检测窗口句柄是否有效的方式代替pIsRecvBroadcast变量
    if(p->m_hWnd != NULL)
    {
    //窗体未Destroy
    }
    else
    {
    //窗体已Destroy
    }
    但最好还是用SendMessage发自定义消息给主窗体,让主窗体处理与窗口有关的事情。
      

  6.   

    不好意思,上面结构体写错了,我之前确实是定义CListCtrl *
    现在发现问题的所在了,我把while循环去掉,也就是让循环里面的语句只执行一次,结果发现RecvBroadCast线程一旦return就立刻报错,这是怎么回事呢,是不是跟CListCtrl有关呢???