下载列表的下载线程与界面是如何交互下载进度的?大家看小弟我这样设计正确吗
下载列表的下载线程与界面是怎么交互下载进度的?大家看我这样设计正确吗?
最近在写一个windows端用户程序,其中涉及到用户点击我的内嵌页中的HTML页面中的下载按钮后,我获得下载地址,把它加入到下载列表中进行下载的操作。
我看迅雷的下载列表在下载任务时,所有任务都是每隔一段时间整体更新一下。这种进度的更新是怎么设计出来的?
我先说一下我的设计思路以及遇到的问题吧:
1. 在我的应用程序启动时,我会创建一个单例类,类中保存有一个List,这个list中保存待下载以及正在下载的文件的名称、大小、类型、下载进度等信息,然后启动一个专门负责下载的下载线程,这个线程会等待一个事件(有新下载任务加入的通知事件),事件触发后该下载线程会去检索List中的待下载任务,来进行下载。
2. 当有新的下载url通过命令行传给我时,我会启动一个解析线程,来根据url解析待下载文件的一些信息,并存放到List中,然后触发等待下载的事件。
3. 下载线程会最多开启五条下载子线程来同时下载五个文件,每条子下载线程在每个文件读取循环后,都会更新一下List中保存的对应该下载文件的下载进度,这样就做到下载线程只负责下载和更新List中的下载进度,不会与界面发生任何交互
第一个问题来了:
我在把待下载任务加入List后,想通知下载列表,把新加入的待下载任务显示出来。我想把各个功能尽量分离开,因此想到了设计一条专门更新界面的线程,这条线程在有正在下载的任务或有新任务加入时,会每隔一段时间检索一下List,并把有变化的List项更新到界面上。可是用PostMessage来给下载列表界面所在的窗口发送消息,也能实现界面的更新操作,那还有必要设计这样一条专门更新界面的线程吗?再者即使设计这样一条专门更新界面的线程,是不是最后在真正的与界面交互的时候,也得在线程中用PostMessage来通知线程呢?
擦 问题还没写完,想明白了。
我必须得设计一条专门更新界面下载进度的更新线程,只有这样才能做到下载线程专门负责下载, 不与界面直接发生任何通信。如果不设计这样一条更新线程的话,我就得在下载线程中来PostMessage给界面才能做到更新操作,这样设计是不好的。
不好意思各位,自己想明白了,不过已经写了这么多了,还是发出去吧,各位也来探讨下,多提一提好的意见,多谢各位了!
------解决方案--------------------
线程太多了,很多都没有必要。
下载底层用Message的方式更新界面即可。
或者,使用Callback的方式,由界面自己通过消息转发。
最近在写一个windows端用户程序,其中涉及到用户点击我的内嵌页中的HTML页面中的下载按钮后,我获得下载地址,把它加入到下载列表中进行下载的操作。
我看迅雷的下载列表在下载任务时,所有任务都是每隔一段时间整体更新一下。这种进度的更新是怎么设计出来的?
我先说一下我的设计思路以及遇到的问题吧:
1. 在我的应用程序启动时,我会创建一个单例类,类中保存有一个List,这个list中保存待下载以及正在下载的文件的名称、大小、类型、下载进度等信息,然后启动一个专门负责下载的下载线程,这个线程会等待一个事件(有新下载任务加入的通知事件),事件触发后该下载线程会去检索List中的待下载任务,来进行下载。
2. 当有新的下载url通过命令行传给我时,我会启动一个解析线程,来根据url解析待下载文件的一些信息,并存放到List中,然后触发等待下载的事件。
3. 下载线程会最多开启五条下载子线程来同时下载五个文件,每条子下载线程在每个文件读取循环后,都会更新一下List中保存的对应该下载文件的下载进度,这样就做到下载线程只负责下载和更新List中的下载进度,不会与界面发生任何交互
第一个问题来了:
我在把待下载任务加入List后,想通知下载列表,把新加入的待下载任务显示出来。我想把各个功能尽量分离开,因此想到了设计一条专门更新界面的线程,这条线程在有正在下载的任务或有新任务加入时,会每隔一段时间检索一下List,并把有变化的List项更新到界面上。可是用PostMessage来给下载列表界面所在的窗口发送消息,也能实现界面的更新操作,那还有必要设计这样一条专门更新界面的线程吗?再者即使设计这样一条专门更新界面的线程,是不是最后在真正的与界面交互的时候,也得在线程中用PostMessage来通知线程呢?
擦 问题还没写完,想明白了。
我必须得设计一条专门更新界面下载进度的更新线程,只有这样才能做到下载线程专门负责下载, 不与界面直接发生任何通信。如果不设计这样一条更新线程的话,我就得在下载线程中来PostMessage给界面才能做到更新操作,这样设计是不好的。
不好意思各位,自己想明白了,不过已经写了这么多了,还是发出去吧,各位也来探讨下,多提一提好的意见,多谢各位了!
------解决方案--------------------
线程太多了,很多都没有必要。
下载底层用Message的方式更新界面即可。
或者,使用Callback的方式,由界面自己通过消息转发。