全局变量:
CWinThread *m_pServerListenThread ;// 服务器监听线程
CSocket *m_SerSocket ; // 服务socket
在CDialog::OnInitDialog构造了m_SerSocket开始按钮触发事件代码如下:
if( m_SerSocket->Create(PORT) == 0 )//PORT 7777 
return ;
if( m_SerSocket->Listen() == 0 )
return ;
m_pServerListenThread = ::AfxBeginThread(_ListenThread,this) ;_ListenThread代码如下:
CSocket *m_RecSocket ; // 客户连接的套接字
for(;;)
{
SOCKADDR_IN client;
int iAddrSize=sizeof(client);
m_RecSocket = new CSocket() ;
m_SerSocket->Accept(*m_RecSocket,(SOCKADDR *)&client,&iAddrSize)
{
continue ;
}
                  //
}
return 0 ;停止按钮触发事件代码如下:
TerminateThread(m_pServerListenThread->m_hThread,0);
m_SerSocket->Close() ;
问题在于点击停止时偶尔会执行到TerminateThread()函数时程序就终止反映,
请问是为什么?还有,在线程中使用socket我觉得我的做法不太好
大家有什么好的建议吗?望各位指教了

解决方案 »

  1.   

    执行TerminateThread()当然会停止反映啦,你以为TerminateThread()只是中断了一个循环等待吗?(如在for里的continue).既然你整个thread都结束了,要继续的话只好再按buttom 了。
      

  2.   

    其实你应该在线程函数中设立退出事件来中止线程比较合理,
    因为你强行杀死线程可能会导致堆栈错误。
    首先创建事件:
    HANDLE     m_hQuitEvent;          // handle to the quit event
    m_hQuitEvent = CreateEvent( NULL, FALSE, FALSE, TEXT("Quit"));
    if( !m_hQuitEvent )
        {
            AfxMessageBox("CreateEvent failed!");
    return;
        }
    for(;;)
    {
            DWORD rc = WaitForSingleObject(m_hQuitEvent, 1);
            if (rc == WAIT_OBJECT_0) 
    {
                break; // quit
            }
    退出时:
    SetEvent(m_hQuitEvent);
    即可。
      

  3.   

    可以用CSocketFile类和CArchive类进行网络通讯呀
      

  4.   

    对应的CreateEvent在最后用不用释放句柄啊?能不能介绍一下多线程开发socket的具体实现?
      

  5.   

    需要释放句柄
    CloseHandle(m_hQuitEvent);
      

  6.   

    to: broadoceans
      关于多线程开发socket我有几点不是特别清楚,望你指教    1.我在网上开到的例子有很多都不是多线程处理socket,CAsyncSocket和CSocket的对应用程序的性能影响分别有多大?推荐来说是否用的上多线程(比如聊天程序).    2.如果使用多线程开发,在线程中有死循环,接收触发的事件退出线程是不是最为合理的,有些代码的写法让我不着门路,是在线程函数的最后一句为开创一个新的线程,的确也实现了原定方案,当对性能的影响也应该很大吧?    具体应该怎么样呢?有没有很经典的多线程的例子让我参考一下?
      

  7.   

    其实不必在创建线程的。
    本身CSocket就是异步的
    你可以继承CSocket类
    在重载OnAccept函数就可以了