关于post事件的问题

angloy 2013-05-24 04:12:25
我有一个问题是数据窗口中设置了3个字段分别是数量、单价、金额。正常情况应该是 金额=数量x单价。但是偶尔会发生 金额<>数量x单价 (这个错误不是数值精度的原因造成的,是完完全全的错误)。我排查了很多遍仍不能确定程序代码哪里有错。正在我准备放弃的时候发现 在保存前有个post事件是用来计算金额的。我印象中post事件的触发时间是不能确定的。有没有可能当数据窗口已经update之后系统才触发了post事件的计算过程。

我就是想知道上述我说的这个问题是不是可能存在的。
...全文
175 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yingmu 2013-06-04
  • 打赏
  • 举报
回复
先说楼主的问题,你的这种写法肯定是先update后再执行post的方法,不明白为什么你这么写。post的特点就是把要调用的事件或方法放到当前代码所在的事件或方法之后去执行,至于你说的有时候行有时候不行,可能是你不小心点了再次update呢?第二次update恰好保存了第一次的post,所以行的时候才是不正常的。 至于11楼说的pb多线程的问题,post的确只是改变执行顺序,而没有再开一个进程,这个真不叫异步,但实际上pb也可以实现类似的多线程,我一般是利用开一个或多个隐藏的窗口,或是openuserobject多个用户控件,打开他们的timer事件,基本上timer事件里的代码会以多线程的形式来运行的,您可以试一下。至于你说的那个只能看到一个静止的图片的问题,就算是使用C++来写,如果要求的系统资源比较高,它可能也会这样(当然机率比较小,C#出现的机率会稍比它大),只不过pb来处理的话,出这个问题的可能性会更大而已。
I_am_Z 2013-06-03
  • 打赏
  • 举报
回复
说点题外话,在我的认识里,好像pb从来都是单线程的,当然,如果你就是另类,搞出个外部函数,弄出个新线程来,我也不奇怪,因为,我也曾经尝试过用c++做一个外部动态库,目的就是创建一个新线程,单独弹出一个窗口。所想达到的目的是让这个窗口能显示一个可以动的gif图片(比如一个进度条)。因为,如果你在单线程的pb中进行高负荷预算的时候,是无法做到同时还能显示动画的,只能看到一个静止的图片。所以,从中我得出的结论是pb也不可能实现什么异步,代码仅仅用post改变执行顺序,这可不叫异步!可能我说这些有些习题大作了,但我还是希望在技术领域能相对严谨一些,如果我说的不对,还请大侠们提点一二,小弟不胜感激。
镜鉴惊境 2013-06-01
  • 打赏
  • 举报
回复
由于一直没有上线回复晚了,不好意思,post的意思就是把要异步执行的事件或函数放到整体函数体或事件体的最后,在执行完这个函数体或事件体以后再返回来依次执行被post的对象,所有经过post的相当于是一个队列,先放进去的先执行。 /以下是点击保存按钮的过程 dw_1.post setitem( "a" , ldc_temp ) …… …… dw_1.update() 你这样写会先update,最后才设置 字段的值,所以问题会很大的
镜鉴惊境 2013-06-01
  • 打赏
  • 举报
回复
引用 4 楼 angloy 的回复:
[quote=引用 2 楼 ssawendure 的回复:] 如果调用异步触发事件,在一段代码中,回先把非异步调用的事件或函数执行结束,然后再回头触发异步调用的事件或函数,就是异步调用默认被放到当前执行代码的最后
我这个post事件是被嵌套在保存事件中的其中某一个事件(比如说是事件a)之中,那么请问这个post事件最晚会在什么时候被调用? 问题补充:这个post事件最晚是会在事件a之后马上调用,还是也有可能在保存事件结束之后才被调用?[/quote] 举个简单的 例子 funciton wf_3() ( sle_1.text = 'wf_3' sle_1.postevent('ue_test') wf_2() ) wf_2() ( sle_1.text = 'wf_2' function post wf_1() return 1 ) 这样在 执行 wf_3()时,是 把sle_1的事件先放最后,执行wf_2(), 在执行wf_2()时由于wf_1()是异步触发又放到最后 这样wf_3执行完以后,开始执行事件ue_test,然后再执行wf_1()
I_am_Z 2013-05-24
  • 打赏
  • 举报
回复
另外,你可以参考这个贴看看我的回复。 http://bbs.csdn.net/topics/390059325
I_am_Z 2013-05-24
  • 打赏
  • 举报
回复
首先,我想说,没什么绝对必要,是不需要加入post来引起大脑混乱的。常规做法,不会在事件中嵌套post,我是建议你将post全部去掉,除非你有必要的需求,那你可以说出来,大家帮你看看是否有必要加入post。windows消息队列的东西,谁也说不准到底怎么执行,我们不是搞操作系统的,不知道哪个线程什么时候能执行,这些都是cpu说了算的。
angloy 2013-05-24
  • 打赏
  • 举报
回复
引用 5 楼 Dersak 的回复:
像你举的这个例子我觉得,那个set的代码会在update之后执行。post是将消息重新在window消息队列中排列的意思,就是滞后排列,滞的是当前事件之后。
由于我这个post事件是被嵌套在保存事件中的其中某一个事件(比如说是事件a)之中,那么请问这个post事件最晚会在什么时候被调用? 问题补充:这个post事件最晚是会在事件a之后马上调用,还是也有可能在保存事件结束之后才被调用? 我测试过很多次,每次测试post setitem事件都是在update之前就被调用了。但是由于post事件我不确定最晚会被调用的时间所以还希望问问清楚,我程序设计上是不是有问题
I_am_Z 2013-05-24
  • 打赏
  • 举报
回复
像你举的这个例子我觉得,那个set的代码会在update之后执行。post是将消息重新在window消息队列中排列的意思,就是滞后排列,滞的是当前事件之后。
angloy 2013-05-24
  • 打赏
  • 举报
回复
引用 2 楼 ssawendure 的回复:
如果调用异步触发事件,在一段代码中,回先把非异步调用的事件或函数执行结束,然后再回头触发异步调用的事件或函数,就是异步调用默认被放到当前执行代码的最后
我这个post事件是被嵌套在保存事件中的其中某一个事件(比如说是事件a)之中,那么请问这个post事件最晚会在什么时候被调用? 问题补充:这个post事件最晚是会在事件a之后马上调用,还是也有可能在保存事件结束之后才被调用?
angloy 2013-05-24
  • 打赏
  • 举报
回复
保存的过程嵌套了N多个事件,没法全都贴出来。我只能大致举个例子。 //以下是点击保存按钮的过程 dw_1.post setitem( "a" , ldc_temp ) …… …… dw_1.update() 当然实际代码嵌套的非常复杂,我就没法全都列出来了。如果是类似这么段代码会不会造成字段a的数据在保存之前没有写入?
镜鉴惊境 2013-05-24
  • 打赏
  • 举报
回复
如果调用异步触发事件,在一段代码中,回先把非异步调用的事件或函数执行结束,然后再回头触发异步调用的事件或函数,就是异步调用默认被放到当前执行代码的最后
I_am_Z 2013-05-24
  • 打赏
  • 举报
回复
能把代码贴上来看看吗?

1,072

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧