搜索
bottom↓
回复: 8

C#中,如何用事件的方式响应一个变量的改变?一个爱着小蜜蜂的单思之人发出的一个简单的

[复制链接]

出0入0汤圆

发表于 2010-7-16 17:40:10 | 显示全部楼层 |阅读模式
这个监视变量的改变不是一个类中自己定义的,如果是自己定义的,在访问器中我也就可以定义响应事件了。这里说的是:
有一个类A,这个类A这个类是你不能改变的,比如是微软提供的类。即这个类的代码你无法修改。比如微软提供的WebBrowser类,TextBox类等,你不准修改。
在这个A类中有一个变量,比如是一个字符串变量kkk;

在你的程序中,你使用了这个类A生成了一个对象 a .
现在问题就是如何实现在对象a中的kkk产生变化时,执行你定义的一个方法(函数)void lll()。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-7-16 19:19:57 | 显示全部楼层
我是不用C#用C++的人,提点建议:
1、首先查找这个类有没有可以监控你需要数据的回调函数,不过我估计十之八九没有的,否则楼主不会在这里问了。
2、采用一个笨的办法,就是你自己写个定时监控函数,去主动查询这个a对象里的这个kkk变量,如果有变化就咨询你的处理函数。如果你对响应时间要求不高,这个方法勉强可以用的。一般来说,每秒千次级别的查询,对系统性能影响不大的。

出0入0汤圆

 楼主| 发表于 2010-7-16 19:53:14 | 显示全部楼层
回复【1楼】jpchen
我是不用c#用c++的人,提点建议:
1、首先查找这个类有没有可以监控你需要数据的回调函数,不过我估计十之八九没有的,否则楼主不会在这里问了。
2、采用一个笨的办法,就是你自己写个定时监控函数,去主动查询这个a对象里的这个kkk变量,如果有变化就咨询你的处理函数。如果你对响应时间要求不高,这个方法勉强可以用的。一般来说,每秒千次级别的查询,对系统性能影响不大的。
-----------------------------------------------------------------------

1.确实没有原生的提供此变量改动的事件回调方法代理.
2.在我的这个单线程程序上不允许那每秒几千次的代价(性能牺牲不是一点点,而是奇卡无比),而这个对变量变化的响应要求又较高.所以很棘手.

出0入0汤圆

发表于 2010-7-16 19:58:19 | 显示全部楼层
kkk既然会变化,那么极有可能是外部事件引起的,例如某个文本框内容被修改,例如数据库中某条记录被update。
这些源头都可以想办法的。

比如文本框可以用钩子、数据库可以用触发器。

出0入0汤圆

 楼主| 发表于 2010-7-16 20:00:01 | 显示全部楼层
之所以用C#,就是因为有网络分布式的应用(WEB页面方式的管理分布于几个县的一大堆电路板).C#明显有优势,特别是后期维护与升级上.

出0入0汤圆

 楼主| 发表于 2010-7-16 20:03:21 | 显示全部楼层
回复【3楼】javenreal
kkk既然会变化,那么极有可能是外部事件引起的,例如某个文本框内容被修改,例如数据库中某条记录被update。
这些源头都可以想办法的。
比如文本框可以用钩子、数据库可以用触发器。
-----------------------------------------------------------------------

数据库可以用触发器,但文本框用勾子勾到的只是典型的WIN消息,而这些消息基本都可以原生处理,这里不是文本框,而是第三方的类库.引发这个改变的确实有事件,但这个事件不足己让我的目标元素立马改变,而是不定时后的改变(网络因素).

出0入0汤圆

发表于 2010-7-16 20:28:14 | 显示全部楼层
回复【楼主位】mikkkz  我爱小蜜蜂
-----------------------------------------------------------------------

继承一下A类,然后自己写响应?

出0入0汤圆

发表于 2010-7-17 00:13:48 | 显示全部楼层
6楼的继承A类的方法好像是不能做到楼主的要求的,因为继承的类也无法做到出现变量变化时通知处理函数。

有个多线程的办法楼主可以尝试一下:
再创建一个线程,将你这个对象的指针传递进去(我不知道C#能否传递引用进去,但指针应该是可以的),在这个额外的线程里,你可以循环查询类A这个对象的kkk变量,注意每次查询后都延时一下,比如1毫秒,免得消耗太多CPU资源,当发行变量改变时,就调用处理函数,或者发个消息给你的主线程,让主线程来处理。发消息到主线程可以避免出现竞争现象,避免冲突。

改成多线程后,高频率的轮询就不会牺牲性能了,因为主线程不需要怎么变化。

C#好像缺省模式是不允许指针的,你要在设置里改成不安全模式,以便使用指针。当然如果能直接用引用的方法,就不需要改成不安全模式了。

这是我从C++方面的一些想法,供你参考,我想思路应该是相通的。

出0入0汤圆

 楼主| 发表于 2010-7-17 11:41:28 | 显示全部楼层
谢谢楼上两位,用6楼的方式我想应可以解决了.还好这个类是可继承的.

讲一下思路:
继承A类生成B类,在B类中定义一新的和A类中的kkk为同一类型的元素JJJ,然后在JJJ的访问器set中同步kkk与JJJ,在JJJ变化时触发响应.
以这种方式应可以解决我在顶楼提出的问题.


同时,也是在单线程中解决的,避免了多开线程.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表