Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 什么样的消费?_Ruby_Tk - Fatal编程技术网

Ruby 什么样的消费?

Ruby 什么样的消费?,ruby,tk,Ruby,Tk,在按钮回调例程中进行一些计算时,如何刷新TKGUI 该例程需要很长时间,用户希望看到一些进展 需要一些方法重新绘制屏幕/查找取消按钮 在gtk中,它是这样的: /*正在进行计算*/ ... while(gtk_事件_挂起()) gtk_main_迭代(); ... /*继续计算*/ 我可能没有抓住要点,但为什么不使用线程呢?您将无法在回调中加入它,但您仍然应该能够生成一个事件 TkButton.new :text => 'Hard routine', :comma

在按钮回调例程中进行一些计算时,如何刷新TKGUI

该例程需要很长时间,用户希望看到一些进展

需要一些方法重新绘制屏幕/查找取消按钮

在gtk中,它是这样的:

/*正在进行计算*/
...
while(gtk_事件_挂起())
gtk_main_迭代();
...
/*继续计算*/

我可能没有抓住要点,但为什么不使用线程呢?您将无法在回调中加入它,但您仍然应该能够生成一个事件

TkButton.new :text => 'Hard routine',
             :command => proc { Thread.new { hard_routine } }.pack
Tk.mainloop

在回调中执行繁重的操作被认为是一种不好的做法,因为它会阻塞整个事件循环,因此gui会冻结。

与GTK代码片段等效的是(任何小部件的)更新方法。在内部,它几乎做完全相同的事情(即,它处理事件,直到没有更多的事情要做,但不等待任何事情发生)


请注意,
update
引入了对回调进行可重入调用的可能性;如果一个事件快速连续发生两次(在GUI代码中很容易发生),那么就有可能在事件内部运行。大多数时候,你可能会侥幸逃脱,但很容易陷入麻烦。引入某种互锁(例如,在处理按钮命令时禁用按钮,这也是一个很好的视觉隐喻)是一个很好的解决方法。

效果很好。。。Tk看起来非常像古老的原始mac事件循环,我没有想到要将其线程化…:-)