封装一个http多线程下载的类,使用了如下函数
InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest 此函数发送下载请求后自动开启了一个线程,暂称之为"Thread"(用ProcessView观察得知),使用 _beginthreadex创建下载线程。
最后使用InternetCloseHandle关闭连接.
问题:
1.运行一个程序实例后,产生一个该下载类对象,执行下载直到下载结束,下载线程正常结束了,但是"Thread"线程并未结束?
2.再次在该实例中产生一个下载类对象,再次执行下载,这次发现下载线程创建成功,但是确挂起了,调用ResumeThread N次也无济于事,spy++显示该线程状态为wait?各位高手,本人初次接触网络和多线程,还请大家不吝赐教

解决方案 »

  1.   

    我给你断点续传的例子吧,不知道你的EMail,功能挺好的,需要的话给我发短信息吧
      

  2.   

    你可以用new一个对象的方法,
    然后下载结束后delete掉。
    重新new一个实例下载别的。
      

  3.   

    这跟具体代码有关了.不贴出来无法帮你.如果你确定ResumeThread的参数的确是用了下载线程的句柄,而下载线程还是处于挂起状态,那么只能推测该线程有个死循环不停调用SuspendThread,这需要你贴该下载线程的源码给我看看.
    不过,我最怀疑的是,ResumeThread用了不正确的句柄.
      

  4.   

    To broadoceans(broadoceans)
    我当然是这么做的,请注意我已说明 再次在该实例中产生一个下载类对象
      

  5.   

    to icelight(给我一个接口,我能驱动地球……………仪)
    呵呵,谢谢你的回答,我仔细调试了一下程序,该线程函数执行一个循环,循环内部就是下载过程,一旦出错或者下载结束它会跳出循环,该循环内并未调用SuspendThread函数,还有,我在程序中响应一个按扭消息用来ResumeThread线程,通过设断点观察发现第二次线程已成功创建,将该句柄穿给该按牛响应函数执行 ResumeThread,点击按牛N次线程仍然挂起,用spy++检查线程id可以确定该句柄有效
      

  6.   

    第二个实例没指定新的下载URL吧(莫非是静态变量)?所以下载线程认为下载已结束所以在空循环?
    sigh,不贴代码如何分析.
      

  7.   

    设置一个CWinTread *cw;
    正常完成时cw=NULL;
    再添加下载任务时(不支持续传,如果支持续传,建议用线程池):
             if (cw == NULL)
    {
    cw = AfxBeginThread (ThreadDownload , this);

    }
    else
    {
    cw = NULL;
    cw = AfxBeginThread (ThreadDownload , this);

    }
      

  8.   

    to icelight(给我一个接口,我能驱动地球……………仪)第二次当然指定了url,如果下载线程认为下载结束它会跳出循环并自动结束自己_endthreadex;这样的话用processview就可以观察到线程结束了
    to yintongshun(踏雪有痕):
    偶用sdk做的,不是mfc
      

  9.   

    由于代码比较乱,等我整理一下发给大家,请两位留个mail
      

  10.   

    http://search.csdn.net/expert/topic/50/5005/2001/8/21/249613.htm
    里面代码包含一个线程管理器,包含等待线程队列/运行线程队列和已结束线程队列的管理
      

  11.   

    现在有个问题,一切初始化成功之后调用
    HttpSendRequest(m_hRequest, NULL, 0, NULL, 0);发送下载请求然后开始下载,在调用这句后会自动开启一个线程(不是我的下载线程),用spy++观察得知它状态始终为wait,即使第一次能够成功下载的期间它也是wait状态,那位能告诉我自动创建的这个线程是做什么用的,还有我成功下载完成之后,释放了HINTERNAT句丙,但是这个线程并未结束