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

推荐订阅源

Google DeepMind News
Google DeepMind News
The Last Watchdog
The Last Watchdog
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
有赞技术团队
有赞技术团队
Last Week in AI
Last Week in AI
量子位
雷峰网
雷峰网
宝玉的分享
宝玉的分享
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
P
Privacy International News Feed
NISL@THU
NISL@THU
V
V2EX
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
T
Threat Research - Cisco Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
IT之家
IT之家
T
Tor Project blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
V
Vulnerabilities – Threatpost
V
Visual Studio Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Hacker News
The Hacker News
Scott Helme
Scott Helme
H
Hacker News: Front Page
罗磊的独立博客
Hacker News - Newest:
Hacker News - Newest: "LLM"
K
Kaspersky official blog
S
Secure Thoughts
www.infosecurity-magazine.com
www.infosecurity-magazine.com
The Cloudflare Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
小众软件
小众软件
月光博客
月光博客
人人都是产品经理
人人都是产品经理
AI
AI
Help Net Security
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
Webroot Blog
Webroot Blog
博客园 - 【当耐特】
PCI Perspectives
PCI Perspectives
A
Arctic Wolf

博客园 - 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的加密算法,我下次就要重新编写算法才能下载了。所以有需要的可以留言,我会把源代码发给大家,但是这里就不贴出来了。