Events GTK+;-如何从方法中侦听事件?

Events GTK+;-如何从方法中侦听事件?,events,event-handling,gtk,Events,Event Handling,Gtk,我正在编写一个运行算法的应用程序,但它允许您通过按下按钮来“逐步完成”算法——显示每一步发生的情况 在方法中如何侦听事件? 看看我的密码 static int proceed; button1Event(GtkWidget *widget) { proceed = 0; int i = 0; for (i=0; i<15; i++) //this is our example 'algorithm' { w

我正在编写一个运行算法的应用程序,但它允许您通过按下按钮来“逐步完成”算法——显示每一步发生的情况

在方法中如何侦听事件? 看看我的密码

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 %d\n", i);
        proceed = 0; 

    }


}

button2Event(GtkWidget *widget)
{
    proceed = 1; 

}

那是什么方法

如果您想这样做,我想到的唯一方法是为您的算法创建一个单独的线程,并使用一些同步方法从按钮单击处理程序中通知该线程


GTK+(更具体地说,glib)有自己的线程和同步机制。据我所知,有一种实现等待通知逻辑的标准方法。

如果您想这样做,我想到的唯一方法是为您的算法创建一个单独的线程,并使用一些同步方法从按钮单击处理程序中通知该线程


GTK+(更具体地说,glib)有自己的线程和同步机制。据我所知,是实现等待通知逻辑的标准方法。

您可以检查挂起的事件并在单击的回调中处理
循环中的事件。在这些方面:

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 %d\n", i);
        proceed = 0; 

    }

}
button1Event(GtkWidget*小部件)
{
继续=0;
int i=0;

对于(i=0;i您可以检查挂起的事件,并在单击的回调中循环时处理
中的事件。这些行中的某些内容:

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 %d\n", i);
        proceed = 0; 

    }

}
button1Event(GtkWidget*小部件)
{
继续=0;
int i=0;
因为(i=0;i这里的“真实”答案(任何有经验的GTK+程序员都会给你的答案)可能不是你喜欢的答案:不要这样做,你的代码结构是错误的

这些选择包括:

  • 建议:将应用程序重新构造为事件驱动;可能需要跟踪您的状态(状态机或布尔标志),忽略当前不适用的按钮
  • 你可以运行一个递归的主循环,就像gtk_main_iteration()的另一个答案一样;但是这是非常危险的,因为任何UI事件都可能发生在该循环中,例如windows关闭或其他完全不相关的事情。在任何规模的大多数实际应用程序中都不可行
  • 将阻塞逻辑移动到另一个线程,并通过GAsyncQueue或沿着这些线路的其他东西进行通信(注意,这很难正确进行,并且可能是过度杀戮)
我认为你在这里出了问题:

 while(proceed == 0)
 {
    listen_for_button_click(); 
 }
你不需要像这样的while循环;你只需要GTK+主循环执行你的阻塞。当你得到按钮时,点击它的回调,然后编写这个while循环之后的代码。

这里的“真实”答案(任何有经验的GTK+程序员都会给你的答案)也许你不会喜欢这样:不要这样做,你的代码结构是错误的

这些选择包括:

  • 建议:将应用程序重新构造为事件驱动;可能需要跟踪您的状态(状态机或布尔标志),忽略当前不适用的按钮
  • 你可以运行一个递归的主循环,就像gtk_main_iteration()的另一个答案一样;但是这是非常危险的,因为任何UI事件都可能发生在该循环中,例如windows关闭或其他完全不相关的事情。在任何规模的大多数实际应用程序中都不可行
  • 将阻塞逻辑移动到另一个线程,并通过GAsyncQueue或沿着这些线路的其他东西进行通信(注意,这很难正确进行,并且可能是过度杀戮)
我认为你在这里出了问题:

 while(proceed == 0)
 {
    listen_for_button_click(); 
 }

你不需要像这样的while循环;你只需要GTK+主循环执行你的阻塞。当你点击按钮时,在回调中,然后编写while循环之后的代码。

right。我在我的报告中给出的建议是button1事件应该初始化button2事件使用的结构在运行算法时跟踪它的位置。+1回答得很好!这是常见的设计“要求”开发人员想出的方法。在回调中循环通常不是一个好主意。虽然gtk_main_迭代用于此类情况。Hmmm不太确定如何处理其他不相关的事件是危险的,因为如果用户关闭窗口,那么他/她希望它关闭,如果您可以增加一点清晰度,那将是非常好的!在大型程序中,y你可能有很多窗口,一些与你正在做的事情无关,IO操作和定时器以及其他类型的东西在你的事件循环中运行。因此,在事件循环中的任何地方,你都必须处理可能发生的任何事情;例如,这可能会释放或修改你正在使用的数据结构。递归event循环也可以防止gtk_main_quit(或g_main_loop_quit)退出程序。递归主循环是对未知的其他概念性“线程”的合作屈服;没有锁定。这是不安全的。对。我在我的报告中得到的建议是button1事件应该初始化一个结构,button2事件在运行算法时用来跟踪它的位置。+1回答得很好!这是一个常见的设计“要求”开发人员想出的方法。在回调中循环通常不是一个好主意。虽然gtk_main_迭代用于此类情况。Hmmm不太确定如何处理其他不相关的事件是危险的,因为如果用户关闭窗口,那么他/她希望它关闭,如果您可以增加一点清晰度,那将是非常好的!在大型程序中,y你可能有很多窗口,一些与你正在做的事情无关,IO操作和定时器以及其他类型的东西在你的事件循环中运行。因此,在事件循环中的任何地方,你都必须处理可能发生的任何事情;例如,这可能会释放或修改你正在使用的数据结构。递归event回路也可保持gtk_主回路退出(或