Ruby 什么样的消费?
在按钮回调例程中进行一些计算时,如何刷新TKGUI 该例程需要很长时间,用户希望看到一些进展 需要一些方法重新绘制屏幕/查找取消按钮 在gtk中,它是这样的:Ruby 什么样的消费?,ruby,tk,Ruby,Tk,在按钮回调例程中进行一些计算时,如何刷新TKGUI 该例程需要很长时间,用户希望看到一些进展 需要一些方法重新绘制屏幕/查找取消按钮 在gtk中,它是这样的: /*正在进行计算*/ ... while(gtk_事件_挂起()) gtk_main_迭代(); ... /*继续计算*/ 我可能没有抓住要点,但为什么不使用线程呢?您将无法在回调中加入它,但您仍然应该能够生成一个事件 TkButton.new :text => 'Hard routine', :comma
/*正在进行计算*/
...
while(gtk_事件_挂起())
gtk_main_迭代();
...
/*继续计算*/
我可能没有抓住要点,但为什么不使用线程呢?您将无法在回调中加入它,但您仍然应该能够生成一个事件
TkButton.new :text => 'Hard routine',
:command => proc { Thread.new { hard_routine } }.pack
Tk.mainloop
在回调中执行繁重的操作被认为是一种不好的做法,因为它会阻塞整个事件循环,因此gui会冻结。与GTK代码片段等效的是(任何小部件的)更新方法。在内部,它几乎做完全相同的事情(即,它处理事件,直到没有更多的事情要做,但不等待任何事情发生)
请注意,
update
引入了对回调进行可重入调用的可能性;如果一个事件快速连续发生两次(在GUI代码中很容易发生),那么就有可能在事件内部运行。大多数时候,你可能会侥幸逃脱,但很容易陷入麻烦。引入某种互锁(例如,在处理按钮命令时禁用按钮,这也是一个很好的视觉隐喻)是一个很好的解决方法。效果很好。。。Tk看起来非常像古老的原始mac事件循环,我没有想到要将其线程化…:-)