众所周知
POE
的消息触发机制会维护一个事件的队列,我经常会开几个
component
,然后来回
post
或者
call
。一直没有在意,
call
和
post
的区别,虽然我是知道这些区别的,但是实际需要用到的时候,这些区别对我而言几乎没有什么意义,所以经常随便用。前两天,因为需要用到网络连接,我决定把一个写得差不多了的
Tk
程序搬到
POE
上。主要的工作一是把变量存在
$_[HEAP]
中,二是将函数改为事件回调。仔细一点的话,一切还是很顺利的,但调试的时候还是出现了一些状况。这个程序差不多是一个在线的文稿系统,在切换文稿的时候,会对为保存信息进行提示,提醒用户保存。但是事情是,对于已保存的文件,在切换的时候,依然会跳出提醒对话框。我怀疑是字体更改标记被修改了,所以对其进行了跟踪,神奇的是在进入保存函数前标记为
0
,可一出函数永远为
1
。在保存函数中,有一个对字体修改事件的回调,该事件会在设置完字体之后将字体更改标记设置为
1
,表示已更改。在保存万之后,需要将该标记重置为
0
,但是这个重置的过程似乎没有起作用。细想之下,才恍然大悟,原来我用了
post
来回调字体设置事件,因此该事件是被放置在事件队列的尾部的,也就是说在保存函数执行完毕之后
POE
才会运行它,那么自然字体更改标记永远会被设置为
0
了。改为
call
之后就一切
OK
了,因为
call
是立即执行该事件的。