惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
美团技术团队
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
博客园_首页
雷峰网
雷峰网
V
V2EX
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)
量子位
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Jina AI
Jina AI
月光博客
月光博客
L
LangChain Blog

博客园 - Samson小天

My researches during my college life. 一些底层的简单东西。 IAT HOOK 实现进程保护 大年初一,总结一下去年的十大事件~ Guessing Game解题报告 (pku 2328) 分析一道08年10月12日的江苏省程序设计大赛正赛题 数学之美 C# 自定义实体类或集合的自动排序 UltraRun is released 简单的QQ游戏中大家来找茬外挂编写思路 最近写C++程序时关于GetLastError的感悟。 在Vista的UAC下检查程序是否具有Admin权限及应用程序的权限切换 从程序开发角度谈类的封装性。 教你如何解决“线程间操作无效: 从不是创建控件的线程访问它” C#中调用WIN32的API 小记delegate,简单的委托介绍 一个计算简单数学表达式值的算法。 string类型的初值不是随便赋的,记一次奇怪的访问冲突事件 对C#中ADO.NET开发的理解
解决多线程产生的“以前的函数求值超时,函数求值被禁用。必须...
Samson小天 · 2008-12-13 · via 博客园 - Samson小天

     今天下载漫画,结果VeryCD上有人只发布了Vol1和Vol2,后面就烂尾了。没办法,去在线看吧,要慢慢等网页加载好,还得看广告。所以就自己做了一个漫画下载者。

     在多线程下载类中,我定义了一个DownloadFinished事件,并将下载信息都返回出去。但是主窗体接受到这个事件后什么都没执行,下了断点之后发现我传进来的参数都变成了“以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值”。

     经过多方查证,终于发现了问题。大家先看我原来错误的代码:

Code

     传入的object实际上是包含着下载信息的一个DownLoadInfo类,我将里面的Uri提取出来,然后下载对应的文件。当下载完毕后发出DownloadFinished事件,事件传出去的第二个参数就是被下载的链接。但是当跨线程到主窗口(也就是主线程)后,这个传入的ui已经不能被访问了。这是为什么呢?

     因为我是在辅助线程里得到的结果,也就是ui这个变量的可访问域只有这个副主线程而已。当DownloadFinished时间发出的时候,就代表着线程已经执行完毕,被销毁了。所以这线程上分配的变量当然都一股脑的被垃圾收集器列为回收对象,主线程自然就访问不到了。那怎么解决这个问题呢?看看下面的代码:

Code

     FileDownLoader是一个类,要想使用StartDownLoad启动线程下载,一定要先实例化一个FileDownLoader变量,而这个变量是存在于主线程的,这话隐含着_dInfo也是包含在主线程中的。再看看新的DownLoadImage方法。完成事件传入的参数不再是线程内的局部变量ui,而是在主线程中实例化好的DownLoadInfo类型的_dInfo变量。这样线程t被销毁时ui被销毁,但是在主函数中存在的_dInfo是不会被销毁的。这样就不会产生”以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值“的问题了。

     本来想把漫画下载器放出来给大家下载的,但是这样对那个网站相当不利,毕竟人家也是要赚钱的。而且一旦放出来,人家肯定会出更BT的加密算法,我下次就要重新编写算法才能下载了。所以有需要的可以留言,我会把源代码发给大家,但是这里就不贴出来了。