我启动了一个线程  并用了一个SetTimer在3秒内
然后在Ontimer()
{
   在一定时间内如果线程没有执行完就用ExitThread终止掉
   可是最后终止的是整个应用程序是为什么呢
}
         //调用远程的数据
 hThread=CreateThread(NULL,
                         0,
                         (LPTHREAD_START_ROUTINE)ThreadFunc,
                         (VOID *)this,
                         0,
                         &ThreadID);
 
     ::SetTimer(m_hWnd,             //指向窗口的句柄。
                    TimeID,            // 定时器标识。
                    1000,                 // 1秒
                    (TIMERPROC) NULL);     // 不使用回调函数。void CBuyDlg::OnTimer(UINT nIDEvent) 
{
//在一定的时间内终止远程数据更新线程和时间函数
::KillTimer(m_hWnd,TimeID);
if (!(this->IsLoadSuccess))
{
ExitThread(ThreadID);    //终止的是整个应用程序??
MessageBox("你的信号不好");
} CDialog::OnTimer(nIDEvent);
}

解决方案 »

  1.   

    hThread个人觉得关闭线程通过线程的句柄比较的好。
      

  2.   

    1楼,CloseHandle并不结束子线程。先说一下别的,好像不用Timer也可以,可以使用WaitforSingleObject,等待时间设置为3秒。
    然后使用ExitThread处理,当然本身ExitThread不太好,可以考虑换一种方法。
      

  3.   

    又发一帖!ExitThread是退出当前线程,已经在另一帖中回复了。
      

  4.   

    TerminateThread(ThreadID);    
      

  5.   

    好的  有思路了   
    MS给的解决方案:
    别人的贴子:
    /*     
      网络连接请求时间超时值在数毫秒级。如果连接请求时间超过这个超时值,请求将被取消。     
      缺省的超时值是无限的。     
      */     
      session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,60000);   
      session.SetOption(INTERNET_OPTION_SEND_TIMEOUT,60000);   
      session.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,60000);   
      /*   在重试连接之间的等待的延时值在毫秒级。*/     
      session.SetOption(INTERNET_OPTION_CONNECT_BACKOFF,500);     
      /*   在网络连接请求时的重试次数。如果一个连接企图在指定的重试次数后仍失败,则请求被取消。   缺省值为5。*/     
      session.SetOption(INTERNET_OPTION_CONNECT_RETRIES,   10);
    MS的BUG:   
      参考:   
      http://support.microsoft.com/kb/176420/EN-US/   
      解决方法:   
      http://support.microsoft.com/kb/224318/en-us   
      其实我也正为这个头疼呢 
      

  6.   

        关闭线程句柄不能结束线程,ExitThread()才可以结束线程,这个函数你用的对!
        只是:结束线程需要在线程函数中完成,即在ThreadFunc()内部调ExitThread()就行了!    建议:最好不要人为的结束线程,让它自己结束是最好的!
      

  7.   

    楼主关闭了主线程,自然关闭了整个程序。使用TerminateThread可以关闭其他线程,但是有可能被关闭的子线程资源清理不干净。最好是
    在Ontimer使用windows核心对象:Event,告诉子线程结束;
    或者
    使用全局变量来协调,注意给此全局变量加volatile关键字。
      

  8.   

    ExitThread只能关闭本线程,楼主关闭了子线程。可使用TerminateThread关闭子线程,但肯能导致子线程资源清理不净。可以使用windows核心对象Event,告诉子线程结束;
    或者
    使用全局变量协调,注意要加上volatile关键字。