封装一个http多线程下载的类,使用了如下函数
InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest 此函数发送下载请求后自动开启了一个线程,暂称之为"Thread"(用ProcessView观察得知),使用 _beginthreadex创建下载线程。
最后使用InternetCloseHandle关闭连接.
问题:
1.运行一个程序实例后,产生一个该下载类对象,执行下载直到下载结束,下载线程正常结束了,但是"Thread"线程并未结束?
2.再次在该实例中产生一个下载类对象,再次执行下载,这次发现下载线程创建成功,但是确挂起了,调用ResumeThread N次也无济于事,spy++显示该线程状态为wait?各位高手,本人初次接触网络和多线程,还请大家不吝赐教
InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest 此函数发送下载请求后自动开启了一个线程,暂称之为"Thread"(用ProcessView观察得知),使用 _beginthreadex创建下载线程。
最后使用InternetCloseHandle关闭连接.
问题:
1.运行一个程序实例后,产生一个该下载类对象,执行下载直到下载结束,下载线程正常结束了,但是"Thread"线程并未结束?
2.再次在该实例中产生一个下载类对象,再次执行下载,这次发现下载线程创建成功,但是确挂起了,调用ResumeThread N次也无济于事,spy++显示该线程状态为wait?各位高手,本人初次接触网络和多线程,还请大家不吝赐教
然后下载结束后delete掉。
重新new一个实例下载别的。
不过,我最怀疑的是,ResumeThread用了不正确的句柄.
我当然是这么做的,请注意我已说明 再次在该实例中产生一个下载类对象
呵呵,谢谢你的回答,我仔细调试了一下程序,该线程函数执行一个循环,循环内部就是下载过程,一旦出错或者下载结束它会跳出循环,该循环内并未调用SuspendThread函数,还有,我在程序中响应一个按扭消息用来ResumeThread线程,通过设断点观察发现第二次线程已成功创建,将该句柄穿给该按牛响应函数执行 ResumeThread,点击按牛N次线程仍然挂起,用spy++检查线程id可以确定该句柄有效
sigh,不贴代码如何分析.
正常完成时cw=NULL;
再添加下载任务时(不支持续传,如果支持续传,建议用线程池):
if (cw == NULL)
{
cw = AfxBeginThread (ThreadDownload , this);
}
else
{
cw = NULL;
cw = AfxBeginThread (ThreadDownload , this);
}
to yintongshun(踏雪有痕):
偶用sdk做的,不是mfc
里面代码包含一个线程管理器,包含等待线程队列/运行线程队列和已结束线程队列的管理
HttpSendRequest(m_hRequest, NULL, 0, NULL, 0);发送下载请求然后开始下载,在调用这句后会自动开启一个线程(不是我的下载线程),用spy++观察得知它状态始终为wait,即使第一次能够成功下载的期间它也是wait状态,那位能告诉我自动创建的这个线程是做什么用的,还有我成功下载完成之后,释放了HINTERNAT句丙,但是这个线程并未结束