一个多线程同时下载多个文件的问题。貌似是线程出错了。

baoyz 2009-02-14 12:15:59
最近做了一个程序,是多线程同时下载多个文件,不是断点续传。

打开程序,选择一个文件列表,选择下载保存目录,开始下载,下载能成功。
可以跳过已成功下载的文件。
1、如果已下载的文件长度和网上连接的到的文件长度不同,视为下载失败,会重新下载。
2、如果已下载的文件长度和网上连接的到的文件长度相同,视为下载成功,会跳过。

但是如果打开程序,下载几个文件后,停止,等完全停止后,再次开始时会出错。必须关闭程序重开。

还有好像如果只开一个线程下载,反复停止、开始也不会有问题。

现在查不出是哪里的问题,请大家帮忙看看,给点建议。
谢谢!


源码文件太大,放在我的资源里了。不要分,直接下。解压后可以直接编译、运行。
http://download.csdn.net/source/1012457
...全文
423 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Future_vc 2009-02-18
  • 打赏
  • 举报
回复
把BOOL CXiazaiDlg::OnInitDialog()
{
bStart = true;
}
放到
void CXiazaiDlg::MyStart()
{
iDowning = 0;
bStart = true;//这里试试
while (iDowning < 10)
{……}
……
}
baoyz 2009-02-17
  • 打赏
  • 举报
回复

UP
baoyz 2009-02-17
  • 打赏
  • 举报
回复

UP
baoyz 2009-02-16
  • 打赏
  • 举报
回复
是呀,重要的数据列表(URL列表和输出文件列表),用线程锁锁住了才改的,如果不停止的话就不会出错。
每次线程初建立的指针,结构等在线程末尾都delete了。

停止了再开始,又或者全部下载完成,再重新下一次,就出错了。
Learn-anything 2009-02-15
  • 打赏
  • 举报
回复
up楼上
cnzdgs 2009-02-14
  • 打赏
  • 举报
回复
具体出什么错?检查一下下载停止后再次开始是否需要重新初始化某些数据。
jameshooo 2009-02-14
  • 打赏
  • 举报
回复
玩多线程,脑袋中时刻要记着“数据保护”,当任何数据要被线程共享时,先想清楚这些数据该如何被使用,是否存在不同步的情况。数据少还比较容易控制,如果共享的数据多了,最好把这些共享数据集中到一起,例如放入一个结构或者类中,由类提供一种合适的锁对象,每次访问类里的数据都要加锁。

另一个要考虑清楚的问题是,如何让一个线程干干净净地退出,不要遗留任何东西,该释放的资源要释放,上锁的对象要解锁,修改的状态要还原。

在没有完全想清楚前,最好不要直接开始写多线程代码,否则同步或者死锁或者资源的问题非常难以定位。
baoyz 2009-02-14
  • 打赏
  • 举报
回复
重试了一次,确认“还有好像如果只开一个线程下载,反复停止、开始也不会有问题。”这句错了。
不论开多少线程,反复停止、开始肯定有问题。

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧