WEB开发网
开发学院软件开发VC 使用 CInternetSession 封装多线程 http 文件下载... 阅读

使用 CInternetSession 封装多线程 http 文件下载

 2007-03-17 22:00:45 来源:WEB开发网   
核心提示: 挣扎在多线程泥潭中的人已经够多的了,其实我们有一个更安全方便的方法,使用 CInternetSession 封装多线程 http 文件下载(2),借助 SendMessage 把线程里的事件发送到窗口线程统一处理,windows会帮我们把所有消息排队执行,所以不支持MFC丑陋的dynami

挣扎在多线程泥潭中的人已经够多的了,其实我们有一个更安全方便的方法,借助 SendMessage 把线程里的事件发送到窗口线程统一处理,windows会帮我们把所有消息排队执行,相当于把多线程程序转成了单线程^_^ (我一个同事把此类用于包含数百个线程的爬虫程序中,非常稳定)

封装结果及使用:template<class T>
class FCDownloadFileWndBase : public T
{
public:
  // 默认构造函数
  FCDownloadFileWndBase () {}
  // CDialog 构造函数
  FCDownloadFileWndBase (UINT nID, CWnd* pParent) : T(nID, pParent) {}
  // CFormView 构造函数
  FCDownloadFileWndBase (UINT nID) : T(nID) {}
  // 创建一个线程下载文件URL,如果URL正在下载中,此函数什么也不做立即返回
  void DownloadFile (LPCTSTR strFileURL, int nPriority=THREAD_PRIORITY_IDLE) ;
protected:
  // 检查链接最后修改时间,有些服务器会禁止查看时间,strTime为空
  // 用户必须重载实现本接口,返回TRUE则继续下载文件,返回FALSE则不再下载文件
  virtual BOOL DownloadFile_OnCheckTime (CString strFileURL, CString strTime) =0 ;
  // 当链接成功下载完成后会调用此接口
  virtual void DownloadFile_OnFinished (CString strFileURL, char* pBuffer, int nLength) {}
  // 当IE设置代理服务器并且服务器需要帐号认证时候回调
  virtual void DownloadFile_OnProxyValidate (CString strFileURL, CString& strUsername, CString& strPassword) {}
  // 出现错误时回调
  virtual void DownloadFile_OnError (CString strFileURL) {}
  // 开始下载一个链接
  virtual void DownloadFile_OnStartDownload (CString strFileURL) {}
  // 当前进度,每下载一块数据就会回调
  virtual void DownloadFile_OnProgress (CString strFileURL, int nNow, int nTotal) {}
};
使用起来非常简单,让你的窗口从它派生,然后选择你感兴趣的事件重载之即可。

几点说明:

本类会自动使用IE里的连接设置,如果代理服务器需要帐号验证,会回调 DownloadFile_OnProxyValidate 让用户输入帐号密码;

因为使用了模版,所以不支持MFC丑陋的dynamic机制:-( ,请把 DECLARE_DYNAMIC 和 IMPLEMENT_DYNAMIC 宏从你的类中移除。如果你需要运行时类型检查,可以用C++的RTTI机制dynamic_cast/typeid;

上一页  1 2 

Tags:使用 CInternetSession 封装

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接