繁体   English   中英

Linux上C语言中的GTK + 3.0:通过信号处理多次回调函数

[英]GTK+ 3.0 in C on Linux: handle multiple calls of callback function by signals

在我的GTK +应用程序中,GtkFileChooserWidget的实例是永久可见的。 通过选择文件(单击),用户可以处理文件。 这是通过回调函数switch_file()完成的。

g_signal_connect (chooser, "selection-changed", G_CALLBACK (switch_file), gs);

switch_file()函数有时会很慢,因为它在模式对话框中等待用户响应。 除非FileChooser中当前选择的文件被删除(由应用程序本身或系统上的任何其他进程删除),否则一切工作正常。 FileChooser显然运行在自己的线程中,然后提交对switch_file()的二次调用,这将导致混乱。 我试图通过使用互斥锁来防止多次通话:

static void switch_file (GtkWidget *widget, gpointer data)
{
   info_t *gs = data;
   int err;

   if ((err = pthread_mutex_lock (&gs->mutex)))
      DebugExit ("pthread_mutex_lock(): %s", strerror (err));

   /* ... */
}

但是,所有对回调函数的调用都是在同一堆栈的同一线程内完成的。 因此,对pthread_mutex_lock()的第二次调用失败(使用了PTHREAD_MUTEX_ERRORCHECK_NP),并退出了进程。

当switch_file()工作时,是否可以推迟对回调函数的调用? 对于用户事件(按键),它已经起作用,但对于由删除文件并行引起的信号却无效。

如果无法推迟信号:收集所有选定文件并随后在主线程内处理它们的信号安全解决方案是什么?

我发现最好的解决方案是忽略信号。 我不确定以下解决方案是否绝对安全,但是否可行。

static int switch_ignore = false;

static void switch_file (GtkWidget *widget, gpointer data)
{
   info_t *gs = data;

   if (switch_ignore)
      return;

   switch_ignore = true;

   /* Do some work on the file system. */

   switch_ignore = false;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM