答 ricky52529 关于EF线程、事件、编译器、IDE……

贴子原文在这里:http://bbs.dywt.com.cn/dispbbs.asp?boardID=148&ID=142326 

因为此文,我们“提前决定”“在编译器正式版发布后”对 ricky52529 授予“特定授权文件(license.key)”。希望朋友们提出更多建设性意见,协助我们共同完善“易语言.飞扬”。(论坛中还有不少朋友表现活跃,我们已经注意到了,谢谢你们!)

在下文中,橙色粗体文字是我们的回复,黑色文字是引用原文。

 


 

新版发布,很高兴,像往常一样,新建一个窗口工程,放一个按钮,目的弹出一个信息框,想半天不知道在哪个类库,忽然发现IDE中的类库提供了一个搜索功能,于是搜索“信息框”,如下:

不错吧~

[例程]

1 展示E飞扬中 线程、事件 例程

我一向很喜欢做一些很有挑战性的事情,比如一门新语言。今天我在这里就剖析一下飞扬的 线程和事件。

源代码请下载:

图片点击可在新窗口打开查看点击浏览该文件

鄙人才疏学浅,只能按照自己已经理解的分析,下面的话仅代表个人观点。

关于线程的创建,说老实话,这一辈子从来没有创建过如此难创建的线程,姑且不说搞清楚内存池的概念,还不得不创建一个继承 线程 的类,因为只有继承了该类,我才可以重写 执行 方法,我个人感觉,官方真是用心良苦,一方面为了减轻复杂度,但同时又增加了代码量,打个比方,我现在要创建100个不同工作的线程,就要创建100个文件,想想吧,这有多么的恐怖。我感觉官方现在的做法就是强行让大家朝面向对象上靠,但我觉得,这些只不过是封装,还谈不上面向对象。想想,官方是挺为难的,如果是我,我也很为难,因为有一大堆基础很薄弱的人在。

引用类库文档:“有两种方法使用线程类:一、通过“初始化(可执行)”方法创建线程类实例,调用“启动()”方法启动线程;二、继承线程类并覆盖“执行()”方法,创建子类实例,调用“启动()”方法启动线程”。(http://dotef.cn/docs/api/libs/多线程/main.html多线程/main.html

这种接口大致参考JAVA,不存在复杂性问题——还有更简捷的接口吗,请指教。要创建100个不同的工作线程,当然需要100个不同的线程类,但不需要100个不同的源代码文件。这是很自然的选择。

关于 事件,我记得论坛上有人发过说有没有C#中一样的事件委托机制,我特意做了一下研究,研究了1个小时,重要明白飞扬所有的事件机制了,我觉得,这哪是事件啊?我唯一可利用的就是对象提供的 发送事件和发送事件2, 发送事件2没有文档,我只能使用 发送事件。文档上说,发送给本对象,我就为了这几个字斟酌了半天,最后算明白了,我的结论如下,不知道对不对:

下班回家了,刚才在公司的例子随手写的,不适合,那直接就分析我上传的代码吧。

在我的 测试线程类 中,我将线程的 执行 重写了,目的很简单,就是根据界面传递过来的整数值决定循环多少次,那么,每次循环的时候,我就要求,都将当前序号通知到界面,交给界面的列表框显示。这种要求在面向对象中太平常了,我立刻就想到,给 测试线程类 建立一个事件,当每次循环进去的时候,触发该事件,而界面只要绑定 测试线程类 的这个事件,每次因为触发,界面对该事件监听的委托就开始执行。我找半天,飞扬里找不到事件绑定的东西,就当没提供吧,可是,我分明看见 对象 提供了 发送事件 的方法,再看文档说明,不得了,发送事件 最终发送到本类,也就是说,我的界面想执行我说的委托函数,就必须把 界面 的实例 交给 测试线程类 ,在那个循环中调用 界面实例 的 发送事件方法,呵呵,这下搞笑了,我都有实例了,直接把那个委托设置成 公共 不就可以了吗?还搞个破事件发送干嘛?之所以提出这个问题,因为我觉得很严重,我这两天在看 arp的 套接字 类,如果没有这套事件机制的话,请问官方的程序员,我如何做到异步通知呢?既然你们谈面向对象,我就必须让界面和数据分离,不是吗?我肯定不能让我的 网络库里还保存一个界面的实例,对不对?我只有通过事件激发机制来进行设计。我知道,也许你们觉得这套方法应该由用户去做,但是,我觉得,既然你们提供了 事件 这个 概念,你们就得做完全点,不能误导用户对事件的理解,否则到C#中一看,都傻眼了。在VC中,也没有我说的这套事件机制,当初在做项目的时候,使用 观察者模式 来建立这套机制,所以,这两天我会发一个事件机制的类库到这个帖子,感兴趣的人,关注一下吧。

EF中暂时没有提供事件委托机制、异步事件机制。目前的事件机制类似于匿名方法调用。

2 昨天晚上说好,给大伙做一个真正意义上的事件监听机制,实现好了,为了实现这样的机制,我写了两个库, 分别是对象动态数组库和扩展事件库,下面的连接是libs.rar,是这2个库的发布版,放到飞扬安装目录EFIDE中的libs就可以了。

图片点击可在新窗口打开查看点击浏览该文件

将libs.rar的两个文件解压缩到libs目录后,开始下载下面的例程。

建议提供这两个ECL类库的“易语言.飞扬”源代码:)

图片点击可在新窗口打开查看点击浏览该文件

实现这样的机制其实不辛苦,辛苦在于飞扬没有提供一个动态数组的类,比如映射表,哈希表这2个最重要的数据结构,EF要么只能支持通用型,要么只能支持对象,我实在搞不懂通用型和对象为什么不实现强转?唉,不想多说什么了,总之,我的动态对象数组库提供了不少方法,看清命名,只支持对象。很有意见的是,哈希表的key和value为什么不能随便选择值型和引用型?搞的我现在火非常大,看来有必要再做一个功能更强大的类库了。

动态数组等,是辅助性功能,可以很容易地借助基本数组类型实现。它不会出现在系统类库中,但会出现其其它类库中。

对象可以这样转换到通用型:创建 通用型(某对象)。今后将考虑直接将对象转换通用型(某通用型 = 某对象; ?语法歧义)。

嗯,通过开发新的ECL类库来增强或丰富原有系统,是很好的思路。

补丁:

刚才看了一下那个谁的发的网络服务端客户端的例子,看到下面这段代码:

客户线程数组 = (客户线程[])客户线程数组.添加(客户线程1);

我看到最后,才发现EF中动态数组的建立是这样建立起来的,从常理来说,客户线程[]初始化,并不创建,而由客户线程数组.添加,然后返回一个 数组出来,这就有了强转,靠,首先很感谢这位朋友让我知道EF确实能这样动态创建数组了,其次,我鄙视官方给的这种写法。[]的使用,本身就是一种静态数组的定义,既然你要实现动态的东西,还引入[]概念干嘛?还非得加个 (客户线程[])强转,代码不美观就算了,感觉就是在拖家带口。我个人觉得,一个真正的动态数组类库,强转的地方应该在于数组取值的时候进行强转,不说了,我写的 动态对象数组类库 就很好的完成了这样的功能,更符合面向对象。我抽空我升级该库,把对通用型的支持也引入其中。

动态创建数组的语法是:创建 对象[n]。数组类.添加() 内部也是使用这种方式,它每次创建一个新的数组返回。

“对象[]”表示一个类型,对象数组类型。当某方法需要返回一个对象数组,而又不能明确数组内的具体类型时,也只好返回“对象[]”,除非引入泛型(这是后话了)。所以上面的数组类型强转也是没办法的事情,您有更好的建议吗?

“[]的使用,本身就是一种静态数组的定义”,没有人这么说过,至少在EF中是不成立的。

另外,我很气愤的是,大家看下图:

我已经报名参加编程大赛了,官方说,如果用飞扬会加分,请问公司人员!你这样限制下去,我怎么能用飞扬写个完整的作品!!!请公司的人看到务必给我一个交代!如果这样限制,我怎么样用飞扬完成一个作品!!!!

正在考虑提供“有使用期限限制”的license.key,或其它可用方案。

 

[提议]

1 实现类似Resharper的辅助工具。

    这个想法也是因为发现输入信息框命令引起的,想法很简单,我一开始的时候不管有没有这个命令,直接输入“信息框”,然后把鼠标光标放在这个命令上,如果库里有这个命令,自动弹出一个框显示它的绝对类库路径,那么我只要单击一下这个框,自动在代码头部添加这个引用,这就要求,官方在一些命令的命名上,必须保持老版本的命名,因为用惯老版本的人第一感觉就是看看这个命令存不存在,希望官方实现这个功能,官方不做,有能力的人可以搞一个这样的开源项目,甚至是共享软件。

就是类似易语言中的“鼠标悬停提示”对吧?已经有这方面的计划了。

2 这个提议我想我必须提~

刚才试用了arp中的套接字类,我很不爽,大家看看这个方法:

创建套接字(整数 通信域, 整数 套接字类型, 整数 协议, apr.内存池 内存池对象)

您知道怎么使用这个方法吗?我只好看帮助,才知道这样描述:

通信域 - 见枚举“地址协议族”,

套接字类型 - 见枚举“套接字类型”。

协议 - 见枚举“套接字协议”,

我的天,这个主意真的非常的馊,我个人觉得,一个好的方法,必须是看到参数的时候就立刻明白要做什么了,我现在把这个方法改成下面的方法:

创建套接字(地址协议族 通信域, 套接字类型 类型, 套接字协议 协议, apr.内存池 内存池对象)

我现在就不问其他人了,我就问官方设计这个函数的人,你觉得你的方便,还是我的更容易明白?哪个更符合面向对象?我觉得官方现在的方法,完全是老的过程式的写法,我迫切要求官方能重视这个问题。

当然是您提供的接口更容易明白。这是具体到apr.ncl这个类库的细节问题,在其它类库中,我们已经尽量使用枚举取代整数了,用户界面库中窗口风格等需进行位操作的整数参数除外。包括上面最后一个参数“apr.内存池”也应该有默认值(空)。所有这些,我们都会认真检查并修改的。希望朋友们及时指出。

[bug]

1 E的自动完成功能,就是当输入一个字母的时候,比如输入“yh”就会弹出一个选择框,选择框中第一项为默认的项,现在官方把该默认的项的选中状态设置为“灰色”,然后,用向下键移动,选中色变成“蓝色”,我的意思是说,可不可以在弹出来的时候,就把第一默认选中的颜色设置为“蓝色”,我近视眼,我一开始还以为没有选中任何东西呢。我不知道这是官方故意这样做,还是忘记这样做。就放这了。

代码完成提示框,它其实是一个列表框,它获得焦点时被选择项为蓝色,失去焦点时被选择项为灰色,这是操作系统的基本约定。在连续输入代码时,编辑框始终拥有焦点,代码完成提示框没有获得焦点,它的被选中项是灰色是正常的。在它没有获得焦点的情形下,故意设置为已经获得焦点的样式,也未必符合用户的使用习惯。总之这个见仁见智的问题,小问题,还可以继续讨论。

代码完成提示框中也会增加粗体、多种颜色支持等风格,这是后话。

回轻描淡写:

这确实是很小的问题,所以我自己都不明白这是不是bug,但从用户体验来说,我觉得更好的体验当然就是一目了然的效果,看下面的resharper做这一块,它默认项就是蓝色,而不是灰色,国外的公司在做这一块,就很好的考虑用户的感受。呵呵,

 

2 我期待的在代码输入框中的左边,用鼠标点一下左边就可以设置断点的功能终于添加上去了,很方便,但是,我在折叠函数的时候,却看到如下情况:

我以为会把这个函数收起来,只留一个函数声明就可以了,可现在倒好,留一个"{"在下面算什么回事?

我们也认为折叠到方法定义所在行比较好。因为修改起来较为困难,只好暂时向后推一下,毕竟这不是功能性问题,至少不属于现在非做不可的事情。

这个代码编辑框,其内核是 scintilla,所有基于此内核的编辑框,基本都是这种折叠方式。

回轻描淡写:
关于这个问题,我这里再给一个C#的做法:

我不管把{放到函数声明下面,而是函数声明右边,折叠起来都是如上图的效果,还是个人观点,老外在设计这一块的考虑确实很周到,因为代码输入的风格每个人都不一样,有些人就喜欢放右边,有些人就喜欢放下面,那怎样满足双方的要求,当然就是以函数声明为主体进行折叠,这样就能满足各种人的需求,想想,如果我就喜欢写下面,难道为了满足IDE要求,我就非得写在右边?那我不太受折磨了?呵呵,以上纯属个人观点。

3 纯粹bug:我做了一个新工程,写代码的时候没有编译通过,可是工具条的状态却依然是运行状态,应该还原成编译前状态。如图:

纯粹bug,没什么好说的,修改。

 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值