本人最近在尝试写个及时通讯,
这个是关闭程序:
期望在关闭的同时,发送一个离线消息到服务器上。
void CClientDlg::OnClose() 
{
// TODO: Add your message handler code here and/or call default
KillTimer(1);
closesocket(SocketOnLine);
AfxBeginThread(ClientDown,this,THREAD_PRIORITY_NORMAL,0,0,NULL); // 打开一个线程,发送离线消息、

CDialog::OnClose();
}
本人想知道,在线程还在运行的时候,
1、主对话框关闭了,那么线程是否继续运行。
2、如果线程还在运行,会受到哪些影响。本人在实际调试中发现,线程仿佛随着对话框的关闭也同时关闭了。

解决方案 »

  1.   

    线程里是怎么操作的?
    不用发线程,直接PostMessage
      

  2.   

    PostMessage 能向远端的服务器发送消息么?
    我期望达到发送一个给服务器发送消息的目的。
    (本人系菜鸟,很菜很菜那种,只是有兴趣,就搞搞玩那种,很多不懂)
      

  3.   

    线程里面是这么写的:UINT ClientDown(LPVOID pParam)
    {
    int ret;
    unsigned long flag = 1;  
    unsigned long unflag = 0; sockaddr_in ServerAddr;
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.203");
    ServerAddr.sin_port = htons(3247);
    SocketDown = socket(AF_INET,SOCK_STREAM,0);
    if (SocketDown == INVALID_SOCKET)
    {
    return 0;
    } ret = ioctlsocket(SocketDown,FIONBIO,(unsigned long*)&flag);
    if (ret == SOCKET_ERROR)
    {
    return 0;
    } ret = connect(SocketDown,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr));
    if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
    {
    return 0;
    } FD_SET fdread;                       //////////  监视集合设定
    FD_ZERO( &fdread );
    FD_SET(SocketOnLine, &fdread);
    timeval tv;                          //////////  超时  设定
    tv.tv_sec = 3;
    tv.tv_usec = 0;

    select(0,0,&fdread,0,&tv);
    if (FD_ISSET(SocketDown,&fdread))
    {
    ret = ioctlsocket(SocketDown,FIONBIO,(unsigned long*)&unflag);
    if (ret == SOCKET_ERROR)
    {
    return 0;
    }

    ret = send(SocketDown,"",1,0);
    if (ret == SOCKET_ERROR)
    {
    return 0;
    }
    }
    else 
    {
    return 0;
    } closesocket(SocketDown);
    return 1;
    }
    线程在3秒内还没有连接,会自动返回终止。
    不知实际运用这样是否会带来问题。
      

  4.   


    因为我考虑到socket通讯方面如果没有和对方连接上,
    可能会出现等待连接的几秒钟,我设定的3秒。如果是不用线程,在Dialog里面,
    我担心出现这几秒钟Dailog无法工作,卡死的情况。
      

  5.   

    你用udp套接字向目标服务器sendto一个包,不会卡住
      

  6.   


    恩,你这个办法不错的。我之前也想过。
    我也想问问,如果依然用TCP/IP,应该还是用线程最好吧?继续提我之前的两个问题,我期望搞清楚流程。在线程还在运行的时候, 
    1、主对话框关闭了,那么线程是否继续运行。 
    2、如果线程还在运行,会受到哪些影响。 本人在实际调试中发现,线程仿佛随着对话框的关闭也同时关闭了。