GTK+ -如何从方法内部监听事件



我正在编写一个运行算法的应用程序,但允许您通过按下按钮来"逐步"执行算法-显示每一步发生的情况。

如何在方法内侦听事件?看看我得到的代码。

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。据我所知,条件变量是实现等待通知逻辑的标准方法。

相关内容

  • 没有找到相关文章

最新更新