专栏首页加菲猫的VFP多线程,是狐友们的意难平,谁能搞定它价值百万。

多线程,是狐友们的意难平,谁能搞定它价值百万。

本文介绍了 ChristofWollenhaupt 的 DMULT.DLL - 一个为你的Visual FoxPro应用程序提供多线程功能的 "辅助 "工具。Christof 的 DLL是迄今为止我发现的在自己的应用程序中添加多线程功能的最简单的方法。

KevinRagsdale

TheNet Results

Voice:931-409-9899

Email: kevin@kevinragsdale.nethttp://kevinragsdale.net

Twitter:@KevinRagsdale

翻译:xinjie

Power by www.deelp.com

简介

这一切都源于《微软Visual FoxPro顾问指南》2006年9月号上的一个简单问题。

问题:如果我可以在后台线程中运行,许多事情就更容易做了。有没有一种方法可以在VFP中创建多线程应用程序?

该问题由特约编辑Christof Wollenhaupt做出回答。

他的答复:这个问题有一个明确的答案。这取决于(你认为什么是多线程应用程序)。

从VFP6 ServicePack 3开始,我们就有能力在Visual FoxPro中创建多线程的DLLs。但这并不意味着我们在创建多线程应用程序,我们只是在创建多线程的DLLs。当你实例化一个位于DLL中的COM服务时,Visual FoxPro只能将其加载到与主程序相同的线程中。

实质上,如果你的DLL正在执行 "一个漫长的处理过程",Visual FoxPro(你的应用程序)必须等待 "一个漫长的处理过程 "完成才能继续。这可能会使用户感到困惑,因为你的应用程序对用户的操作没有反应,同时也为Windows在你的应用程序的标题栏上附加一个不那么漂亮的"(停止响应)"(图1)。

图1: Windows 提供的"有用的" 停止响应消息

本文介绍了Christof编写的一个C++ DLL "辅助工具",他在上面提到的解答部分做了进一步的详细解释。

01

到底什么是多线程?

依据我在书本、文章和无数谷歌搜索中看到的关于多线程的所有定义,多线程就是:在一个应用程序中同时执行多个活动的能力。如今,随着我们的多核CPU的出现,这一点更加真实。

来自维基百科:在单个处理器上,多线程通常通过分时复用(如多任务)发生:处理器在不同的线程之间切换。这种上下文切换通常发生得足够频繁,以至于用户认为这些线程或任务是在同一时间运行。在多处理器或多核系统上,线程或任务实际上是同时运行的,每个处理器或内核都在运行一个特定的线程或任务。

On a single processor, multithreading generally occurs by time-division multiplexing (asin multitasking): the processor switches between different threads. Thiscontext switching generally happens frequently enough that the user perceivesthe threads or tasks as running at the same time. On a multiprocessor ormulti-core system, the threads or tasks will actually run at the same time,with each processor or core running a particular thread or task.

来源:http://en.wikipedia.org/wiki/Multithreaded

02

多线程的优势有哪些?

对我来说,多线程的第一大优势很简单:应用程序用户界面的响应速度。

以前有人说过很多次,对于用户来说,你的应用程序的用户界面就是应用程序。根据我的经验,没有什么比一个没有反应的用户界面更让人觉得糟糕的用户界面(和糟糕的应用程序)了。

另一个优点是能够在不打断用户工作流程的情况下执行必要和/或可选的功能。我在几个应用程序中使用多线程请求,在后台检查程序的更新。如果发现有更新,应用程序会向用户通知其可用性。另一个应用程序在后台从几个不同的网站拉取各种信息,解析信息,写入表格等,当用户在应用程序中做其他事情时,根本没有意识到后台有多少工作在进行。简而言之,即使在忙于执行多项任务的情况下,该应用程序仍然对用户有反应。

03

“一个漫长的处理过程” 的简单示例

让我们来看看一个由多线程DLL中的SomeLengthyProcess触发的无响应UI。

我有一个名为SAMPLE.PJX的项目,它包含一个名为

SAMPLEMAIN.PRG,我把这个项目编译成一个多线程的DLL(SAMPLE.DLL在本次会议的源代码中)。

下面是SAMPLEMAIN.PRG的代码:

DEFINE CLASS EasyMTServer As Session OLEPUBLIC 
    PROCEDURE SomeLengthyProcess (toCallback) 
       
** 我们需要声明 Sleep 这个 Windows API 函数      ** 确保进程可以持续 20 秒 
      DECLARE Sleep IN WIN32API Long 
 
      ** 创建一个 FOR/ENDFOR 循环 
      LOCAL lnCount As Integer 
 
      ** 在 VFP 主窗口输出一个字符串
      FOR lnCount = 1 TO 20 
        ** 在 VFP 主窗口输出 SYS(2015)的值
        toCallback.DoCmd("? + ALLTRIM(SYS(2015))") 
 
        ** 等待 1 秒
        Sleep(1000) 
      ENDFOR        
      ** 输出字符串 “Done!” 
      toCallback.DoCmd("? + 'Done!'") 
    
      CLEAR DLLS "Sleep" 
    ENDPROC 
  ENDDEFINE     

看起来是一个漫长的过程,对吗?它应该需要20秒的时间来运行。在实例化COM服务(DLL)后,我将调用SomeLengthyProcess方法,并传入_VFP对象作为回调。在20秒内,DLL将创建一个SYS(2015)字符串(每秒一次),并告诉_VFP将该字符串写出到VFP主窗口。

从VFP命令窗口调用DLL看起来像这样:

loDLL = CREATEOBJECT("sample.EasyMTServer")  
loDLL.SomeLengthyProcess(_VFP) 

完美!我有了一个多线程的DLL,它在20秒内一直在忙碌,向VFP写回数据,以便我看到它在做什么。我有一个多线程的DLL,它保持20秒的忙碌,向我的VFP会话写回数据,这样我就可以看到它在做什么。但是,有一个问题。

我的VFP会话没有反应(图2)。我可以随意点击、双击甚至三击任何地方,但当SomeLengthyProcess运行时,什么也没有发生!我的VFP会话没有反应(图2)。

图 2:在单线程中并不能实现真正的多线程

在 VFP窗口周围点击会导致Windows在标题栏上附加之前显示的"停止响应 "信息。有时,VFP窗口(或您的应用程序)会褪色(图3),在Windows Vista/Windows 7中,您(或您的用户)可能会看到类似图4中的信息。

图3: 一个没有反应的应用程序,被Windows淡化了

图4: 当你的应用程序没有反应时,就不是很好玩儿的事了

正如我在简介中写的那样(根据Christof顾问回答中的信息),当你实例化一个位于DLL中的COM服务时,VFP只能将其加载到与主程序相同的线程中。因此,当SomeLengthyProcess在运行时,VFP IDE是不可用的。

04

一些 “辅助”工具

然而,正如Christof进一步解释的那样,并不是没有可能实现。即使你在VFP中创建了一个MTDLL,你也需要一个额外的辅助工具来创建一个新线程,初始化内存空间,并加载COM服务。

据我所知,有三个这样的"辅助 "工具(Christof在他的回答中都提到了这些工具):

Remus Rusano 的 VFPMTAPP.DLL

来自 Calvin Hsia 博客的代码

Christof 的 DMULT.DLL

请期待明天的更新,搞定多线程的正式代码就来啦。

写在最后面的话

加菲猫的VFP公众号接受投稿,一经采用,即有稿费,稿费暂定50元一篇。

加菲猫的vfp倡导用VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发。

已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。

本文分享自微信公众号 - 加菲猫的VFP(VFPPLUS),作者:firstxinjie

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 曾是互联网开山鼻祖,如今日渐式微,张朝阳到底做错了什么?

    这是6月9日张朝阳正式推出狐友APP后的第二天,一位名叫@老雕虫的网友在知乎上写下的一句评语。

    IT大咖说
  • 自媒体大战,搜狐胜算在哪?

    某手机浏览器厂商向笔者打听百家、大家的一些规则。因为,他们也要做自媒体平台。 任何事情,当看上去不相关的玩家也想入局时,说明这个局已经有泡沫,同时也说...

    罗超频道
  • 华为薪资垫底,腾讯阿里被逆袭,第一竟然是… | 2018互联网公司薪资排行榜

    但他说,公司里90%以上的同事工资都比他高,他这只能算是倒数,当时大家都认为他在装X。

    顶级程序员
  • 选完校花又选校草,张朝阳为什么对造星如此执念?

    最近,有一场来自搜狐狐友的热门选秀吸引来了宁静、李斯羽、江映蓉、黄英等女明星评审,搜狐董事局主席兼首席执行官张朝阳也亲临坐镇,评审名单里还有柳岩、于莎莎、瞿颖、...

    罗超频道
  • 旧恨未解,新仇又结:五个视角看搜索的格局之变

    腾讯战略投资搜狗,包括搜索引擎在内的中国互联网格局再次发生剧变。搜狗在最近一年的传言中,一直游走于BAT3这四个巨头之间。360更是无限接近搜狗。最新一...

    罗超频道
  • 孙宇晨鄙视王小川,这个世界很残酷却不温柔

    以3100万人民币拍下巴菲特20周年慈善午宴的孙宇晨迎来人生最高光的时刻,对于大多数创业者来说,这样的时刻往往会是上市敲钟时,对于以“创业者”自居的孙宇晨来说,...

    罗超频道
  • 今年搜狗要IPO:终于要把欠王小川的女朋友还上了

    今天,搜狗将于年内IPO的消息传出,搜狗官方对此回应称IPO并无时间表,但这个消息来源是搜狗CEO王小川,应该是八九不离十——至少王小川为代表的管理层有在201...

    罗超频道
  • 腾讯借微信封杀抖音,抖音虐快手反杀腾讯

    没有人会想到,一款毫不起眼的APP 快手,能从农村起家,迅速以星星之火,燃烧整个中国,收割几亿用户。

    挖数
  • 搜狐二季度财报发布,视频盈利之日就是二次崛起之时

    张朝阳在年初时曾明确,“2018年搜狐视频通过自制内容模式,将视频预算削减40%;付费收入将在2018年赶上广告收入,同时视频广告也将迎来增长,搜狐视频预计在2...

    罗超频道
  • 流量已成所有企业心病 T哥分享如何才能做好市场营销?

    这个话题不是很新鲜,却很难解决,有很多企业的老总都曾问过我一个问题就是如何推广?特别是在移动互联网时代下,如何才能更有创新的让自已好的产品快速的遍布网络的每一个...

    人称T客
  • 笑喷了!20条关于数学及数据分析的冷笑话【爆笑星期天】

    1、“我是搞数据分析的, 学会了如何从DW中用SQL对数据ETL并建立了Cube。然后算啊算啊算,得出结论:今年2月份营业收入远远小于其它月份。我试图用...

    小莹莹
  • 那些“笑死人不偿命”的数据段子:把前女友推荐给老婆

    1. “我是搞数据分析的,学会了如何从DW中用SQL对数据ETL并建立了Cube。然后算啊算啊算,得出结论:今年2月份营业收入远远小于其它月份。我试图用spss...

    CSDN技术头条
  • 搜狐股价暴涨:你看到了搜狗IPO,我看到四大业务板块都在发力

    曾被唱衰的诸多中国互联网公司,最近密集上演“逆袭大戏”。曾被指活跃度下滑的微博今年市值最高站到180亿美金的高位;遭遇流年不利的百度上周发布Q2财报后股价大涨、...

    罗超频道
  • 3B大战一周年:360颠覆百度,难!

    2012年8月21日,360浏览器默认搜索引擎由谷歌正式替换为360综合搜索引擎,3B大战爆发。一年后的今天,360从无到有,以大约15%的份额跻身中国搜索引擎...

    罗超频道
  • 2017年第一季度中国互联网死亡名单

    时势造英雄,我们所生活的这个时代,几乎每天都会有新的互联网企业诞生。与此同时,也几乎每天都有前人倒下。 这是最好的时代,也是最坏的时代;人们正直登天堂,人们也正...

    钱塘数据
  • 发力线下摄影展,各新闻客户端激起的会是浪潮还是浪花?

    2016年11月19日至25日,腾讯《交界线•腾讯影像力摄影展》在2016连州国际摄影年展展区落地,展览分生、家、路、活四个主题,展示了9位摄影师的作品。连州国...

    曾响铃
  • 金庸的武侠世界和SAP的江湖

    2018年10月30日晚,成都地铁一号线,Jerry手机app上突然弹出来一条金庸去世的新闻。

    Jerry Wang
  • 搜狗营收创新高,股价却跌7%,对话王·玄奘·小川

    昨天(7月30日),搜狗交出了截至2018年6月30日的第二财季成绩单,总营收3.014亿美元,比去年同期增长43%,净利润3820万美元,比去年同期增长58%...

    量子位
  • 2014年自媒体将走向垂直细分和本地化

    要过年了,除了疯狂抢红包之外,我们做的另外一件事情很可能是聚餐。跟亲戚,跟同学,跟旧友,难免都会小聚一下。如何决定去哪里吃呢?很多吃货朋友竟然是通过自媒...

    罗超频道

扫码关注云+社区

领取腾讯云代金券