我正在编写一个运行算法的应用程序,但允许您通过按下按钮来"逐步"执行算法-显示每一步发生的情况。
如何在方法内侦听事件?看看我得到的代码。
static int proceed;
button1Event(GtkWidget *widget)
{
proceed = 0;
int i = 0;
for (i=0; i<15; i++) //this is our example 'algorithm'
{
while (proceed ==0) continue;
printf("the nunmber is %dn", i);
proceed = 0;
}
}
button2Event(GtkWidget *widget)
{
proceed = 1;
}
这不起作用,因为它需要在侦听button2(或任何其他事件)之前退出button1方法。
我在想类似于while循环的东西。
while(proceed == 0)
{
listen_for_button_click();
}
那是什么方法?
这里的"真正"答案(任何有经验的GTK+程序员都会给您的答案)可能不是您喜欢的答案:不要这样做,您的代码的结构是错误的。
选项包括:
- 建议:将应用重构为事件驱动;可能您需要跟踪您的状态(无论是状态机还是布尔标志),并忽略当前不适用的按钮。
- 你可以运行一个递归的主循环,就像另一个答案gtk_main_iteration();然而,这是相当危险的,因为任何UI事件都可能发生在该循环中,如窗口关闭或其他完全无关的事情。
- 将阻塞逻辑移动到另一个线程,并通过GAsyncQueue或沿着这些行进行通信(注意,这很难正确并且可能过度)。
我认为你错了:
while(proceed == 0)
{
listen_for_button_click();
}
你不希望像这样的while循环;您只需要GTK+主循环执行阻塞。当按钮被点击时,在它的回调中,然后编写while循环之后的代码。
你可以检查挂起的事件&在单击的回调中处理while
循环中的事件。下面这些行:
button1Event(GtkWidget *widget)
{
proceed = 0;
int i = 0;
for (i=0; i<15; i++) //this is our example 'algorithm'
{
while (proceed ==0)
{
/* Check for all pending events */
while(gtk_events_pending())
{
gtk_main_iteration(); /* Handle the events */
}
continue;
}
printf("the nunmber is %dn", i);
proceed = 0;
}
}
这样,当点击第二个按钮的相关事件被添加到待处理的事件队列中时,检查将看到事件为待处理事件并处理它们&然后继续。这样,您的全局价值变化就可以反映出来。步进应该是可能的。
希望这对你有帮助!
如果你想这样做,我想到的唯一方法是为你的算法创建一个单独的线程,并使用一些同步方法从按钮单击处理程序中通知该线程。
GTK+(更确切地说是glib)有自己的线程和同步API。据我所知,条件变量是实现等待通知逻辑的标准方法。