按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!

键盘新用户想要体验按钮功能,开通键盘产品权限,可私聊小编,提供按钮新人折扣!

上一节我们讲了整个数据的结构设计,并通过数据可视化的步骤,把数据弄成了我们展示的界面。

这就彰显了我之前仍然指出的,编程的本质,就是处理数据,所有程序都是为了处理数据而生的,计算机也是为了这个目的被制造下来的,我们写代码,核心一定要围绕着数据来,其他东西,都是给数据管理打辅助的。

接出来让我们把视角置于源代码视图:

图片[1]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

这儿源代码只有1000多行,和好多高阶的作者比,这个代码量绝对算是小儿科了。

其实,这并不是xTask全部的源代码,由于键盘精灵2014的代码编辑器很卡,代码量一旦上了几千行以后,敲代码都卡卡的,所以我通常在这儿写代码的时侯,还会刻意控制代码数目。

为了便捷你们阅读和改写,我曾经在开源时早已对代码做好了分类和注释cf按键精灵脚本源码,在代码中,可以看见好多这样的注释:

图片[2]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

这种注释把1000多行代码拆成了10个功能块,每位功能块的所有函数都只干一件事情:

程序加载初始化代码:

窗口加载时执行的代码,它会初始化环境,创建数据模型,引入基础运行库,之后加载储存在数据库中的task列表,以及调用项目管理的功能,扫描project目录下的工程,将工程添加到列表。

项目管理相关功能:

负责扫描项目列表,将列表更新到界面上,以及风波响应(切换项目时的界面动作)

项目七日存留相关功能:

就是控制项目注册的角色,7天时间内不断流失注册用户的数据模拟功能,这部份和原始需求有关,反而不须要你们去深入理解。

这一部份主要负责的也是界面的响应。

项目数据库管理相关功能:

项目数据库管理界面相关的功能响应。

账号导出导入插口代码:

帐号导出和帐号导入两个界面的功能响应。

任务管理相关功能:

任务计划界面的风波响应,也负责一些基本逻辑的实现,例如创建、删除、修改任务等。

程序设置键位设置相关功能:

比较简单的设置界面,可以像键盘一样按某个键启动和结束计划任务。

任务监控界面和整体调度功能:

这是比较核心的功能,任务的具体执行从这儿开始,任务界面的响应代码也都在这儿,然后我们会详尽讲解。

任务线程创建:

也是比较核心的功能,任务的每一个线程都从这儿开始创建,WorkThread函数是框架内所有任务子线程的统一入口。

全局数据监控:

这儿的代码用于刷新全局数据界面,来把与框架运行有关的所有核心数据都给展示下来。

全局数据:

代码看完了,接出来我们看全局数据部份,我们的框架只使用了特别少的变量,由于我们又折叠数据成结构的方式,这个一会再讲,全局变量的定义如下:

图片[3]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

我比较喜欢吧所有用到的变量都显式定义一下,基本上数据就如此多了。

可以见到第一行定义的变量都以_Ptr结尾,这是表针的意思,可以理解为是一个对象的表针,这个对象里,就以结构化储存着我们所须要的全部数据。

G_Atom_Global_Ptr是全局数据

G_Atom_Thread_Ptr是线程列表数据

G_Atom_Task_Ptr是计划任务列表数据

G_Atom_Proj_Ptr是子项目列表数据

G_Atom_Context_Ptr是上下文数据,上下文数据是传递给线程用的,我们每次创建线程的时侯,就会把这个线程须要的数据用这个对象传送过去,之后线程能够很便捷的访问那些数据了。

之后第二行,是一些普通的全局数据:

G_Index_Proj当前选择的项目(QUI使用的)

图片[4]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

G_Index_Task当前选择的计划任务(QUI使用的)

G_Lock_Thread线程锁,创建线程的时侯用的,xTask每次创建线程,就会用锁把数据保护上去,即使创建10000个线程,也不会出现数据错乱的情况。

G_Path_Root程序根目录

线程锁的功能,由我编撰的DLL实现(所以解析这东西的源代码,也是希望能给你们带来一些有趣的玩意儿,这儿用到的不少东西,都是值得单独掏出来玩的):

到这儿代码就分类的差不多了,接出来我们详尽讲解一下,当小精灵启动的顿时,我们的框架都干了些哪些。

窗口创建风波代码解析:

代码如下:

图片[5]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

图片[6]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

嗯,代码量并不多,但是注释很丰富,应当不难理解吧?

【重置全局数据】就是把全局数据都给清0了,防止QUI读取数据设置界面属性的时侯出现错判,任何情况下,我们都应当养成这样的好习惯,好多时侯BUG就是如此来的。

【重定向工作目录】读取option.ini的setup小节的work数据,之后把{$root}替换成程序所在目录。

这是为了啥?由于我做的这个东西,正常来说它是弄成小精灵单独运行的,但我在开发它的时侯常常须要在键盘精灵环境下运行,假如我要在两个地方都运行,那数据就得整两份,我不想这样,所以加入了这个根目录重定向功能,可以在键盘精灵环境下,把根目录重定向到小精灵的目录里,这样我在两个地方运行脚本,环境都是统一的了。

最后我们估算好的根目录,会形参给G_Path_Root,之后我们只会通过这个变量作为我们的工作目录了。

【注册运行库】调用了RegeditRtl函数,它的代码是这样子的,就是把大漠插件啊,DWX插件啊哪些的都给注册到系统上面,顺便检测一下MD5值,由于有段时间感染型病毒挺多的,我怕把dm.dll感染了,回头运行的时侯出错又找不到缘由,当心驶得万年船:

图片[7]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

图片[8]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

【创建系统运行环境(加载各类支持库)】调用了LoadLibrary函数,代码很简单,长这样:

图片[9]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

这段代码咱须要好好说道说道了,上面不是说这1000多行代码不是全部代码嘛,由于好多代码被我以VBS的方式写在外边了。

图片[10]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

这段代码虽然就是创建一个fso对象,读取library目录下的System_Task.vbs,之后把这个vbs在键盘环境里运行一下,于是这个文件里的函数,键盘就都能用了。

这种做完以后,我还调用了xTask_System_Create函数,代码也很简单,它长这样:

图片[11]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

它又调用了一大堆include函数,这东西实际上就是上一个函数的翻版,只不过可以自定义导出的文件了,它长这样:

图片[12]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

好嘞,也就是说,那边一行代码,实际上整个library目录下的VBS文件,基本都进来了,这种vbs也有个几千行代码了,这也是xTask为何源代码这么少的诱因。

其实,到这一步我们还没有调用任何东西,所以不用太害怕它的复杂度。

【创建全局Atom对象】这部份代码就是把我们全局变量里定义的这些_Ptr的数据给创建下来,它调用了CreateAtom函数,代码很简单,长这样:

图片[13]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

其中G_Atom_Global创建为字典,G_Atom_Thread、G_Atom_Task和G_Atom_Proj创建为链表,创建完了以后,把她们的表针保存上去备用,之后创建全局线程锁对象。

这儿用到了xVarDict和xVarList函数,我们在源代码里搜索找不到,实际上这俩函数在library目录的Rtl_xTask_lib.vbs文件内,它和它的兄弟们长这样:

图片[14]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

xAtom相关的功能都写在这个文件里,这是一个我定义的类,VBS支持类的特点,还支持default调用,封装一下用上去很爽。

xAtom这个名子取意原子,就是说这个类下边的所有操作都自带原子特点,不管是一个最简单的数值,还是字符串,还是结构化数据,都带线程锁,多线程同时读写非非思,不会出问题。

是为了xTask专门开发的库,感兴趣的兄弟可以看一下源代码,不感兴趣的兄弟,会用就行了,关于这个类的用法,我整理了帮助文档,在二次开发资料目录下的xTaskLibrary帮助文档.chm里。

【系统初始化】它调用了xTask_System_Init函数,在键盘里是搜不到这个函数的,实际上这个函数在library的System_Task.vbs里,长这样:

图片[15]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

也就是读一些配置,没哪些稀奇的,这儿可以注意一下,G_Atom_Global和我们键盘里定义的G_Atom_Global_Ptr是一个意思,它似乎是一个类,并且定义了default特点,而default定义给了一个属性,所以可以如此用,等价于这些写法:G_Atom_Global.List(“RT_Start”,0)

然而这个写法看上去似乎在访问一个Table一样,很甜美,这也是为什么这种功能我要用VBS实现的诱因。

【设置运行停止键位】这里没哪些稀奇的了,就是读配置,之后设置键位。

【加载任务计划选项】读配置,改界面。

图片[16]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

【刷新项目列表】调用了ScanProjList函数,长这样:

图片[17]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

这儿调用了xProj_LoadAll函数,这个函数保存在library目录下的SysRtl_Project.vbs里,长这样:

图片[18]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

原理也很简单,就是fso对象扫文件夹,之后扫到的所有子文件夹调用xProj_Load函数加载,这个函数也在同一个文件里,长这样:

图片[19]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

xTask容许不同编程语言来实现不同的工程,即可以用VBS,也可以用能写DLL的语言做个DLL,或则你自己高兴的话,在这儿写一个加载器,也可以用你写的语言来弄,太原小异了,这只是一个路由函数,最终的活似乎是xProj_Load_VBS干的,它也在这个文件里:

图片[20]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

图片[21]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

代码并不复杂把,就是读数据,填数据而已,好多同学可能会好奇,我下载的xTask开发包为何一运行上去就弹个对话框呢?有问题吗?虽然没问题,就是在这儿弹的,这个工程加载器肯定不会随意弹个窗口下来,然而他加载的工程会呀,你看他是会读取项目代码的,之后运行!

运行的是Sys_Init函数,通过xProj_CallProc来调用,这个函数就是拿来调用工程内指定函数的,代码十分简单:

图片[22]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

这一段代码有点长征的意味了把,一层套着一层的,但实际溯源出来,当然也不算复杂,就是把目录扫描一遍,把配置文件都给读下来,存在我们自己的结构化数据上面,之后脚本加载上,调用一下Sys_Init函数,说简单点,就是我们用键盘精灵又做了一个按钮精灵,我们自己的xTask其实也有按钮精灵的启动风波咯。

到这儿我先休息一下,再度指出一个问题

不晓得你发觉了没有,当我们对数据的掌控达到这样的程度以后,虽然一切东西管理上去,也就这么回事了。

所以说呀,数据,数据,数据,数据才是编程的核心,别特么学几条他人封装好的指令认为自己是前辈了四处胡扯,很幼稚。

好好的,把数据管理的基本功给练好了先。

休息完毕,接着说代码

【刷新任务列表】这里和上一个部份长治小异了,从几个文件跳来跳去的,不过这个比项目可简单多了,我认为你能看懂项目加载那部份,那这儿也不成问题:

图片[23]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

调用了xTask_LoadAll加载任务列表,调用了RefreshtTaskGrid刷新QUI,刷新QUI的代码就在xTask键盘工程里,这儿看一下xTask_LoadAll吧,这个代码在library的SysRtl_Task.vbs里:

图片[24]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

图片[25]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

这儿我们创建了DB变量,作为tz_TextDataBase类的实例,tz_TextDataBase类是一种文本数据库,性能很低,并且用上去比较便捷,我闲着没啥事的时侯写的。

代码就在同目录的Rtl_xdb.vbs里,感兴趣的话就研究一下吧,为什么不用Access?由于这玩意儿有些系统破坏了驱动,运行不上去,我可不希望我写的破玩意儿还挑系统。

为何不用SQLite3?由于SQLite3想用VBS调用的话,得安装一个ODBC驱动,我可不希望我写的破玩意儿还得安装某些的东西才会用,所以,凑活一下咯,我这个数据库也不是完全没有优点,例如弄数组的时侯,就挺便捷的,也正是由于这个优点,所以我这个xTask框架的灵活性也提高了不少。

剩下的代码就马马虎虎了,都是数据操作,没哪些稀奇的,一眼能够看明白,不讲了。

【加载项目类型】这段代码就是QUI操作咯。

【加载导出/导入账号方案】也是QUI操作,之后调用ChangeImportUserList函数触发了一个风波,就是列表改变的,不然必须切换一下界面才变,不美观,小细节了。

最后是【刷新全局数据列表[默认页面]】

可算讲完了,尼玛,气死我了。

这儿调用了RefreshAtomListEvent函数,这函数很简单,长这样:

图片[26]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

它调用了RefreshAtomList函数,就是传入一个xAtom对象表针,之后把这个xAtom的数据遍历完了,显示在表格里,代码长这样:

图片[27]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

运行之后的疗效长这样:

图片[28]-按键新用户想要体验按键功能,可私聊小编,提供按键新人折扣!-唐朝资源网

于是我们就可以开开心心的查看整个框架里所有的数据啦!

路径列就是对应的数据访问方式(直接写在代码里就行)

index列是说这个数据相对于它的父节点的索引

数据类型就是数据类型了,字符串在这儿称作Buffer,由于内部实现就是自下降缓冲区,速率还挺快的。

数据内容就是它的实际值,之后引用计数,是用于手动释放的机制,这个数据引用一下就+1cf按键精灵脚本源码,释放一次就-1,懂引用计数机制的人应当晓得啥意思,不懂耶没影响,不管他就是了。

一个程序的窗口加载就讲了如此多,想要获取源码命令素材,推荐关注按钮精灵峰会,知乎帐号,陌陌公众号“按键精灵”获取!!有任何问题也可以在顶部留言或则私信小编。

本篇详尽内容可点击:【源码解析】从零开始教你开发自己的脚本框架(二)_【集结令●英雄归来】教程比武竞赛-键盘精灵峰会

© 版权声明
THE END
喜欢就支持一下吧
点赞74赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容