LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1085|回复: 4

GTK中g_time_out和线程的不同

[复制链接]
发表于 2005-9-27 12:23:42 | 显示全部楼层 |阅读模式
如倮你用一个线程去改变窗口中的widget,它不会实时显示!
但如果你得用计时器来实现,就可以实时显示所修改的东西!
 楼主| 发表于 2005-9-27 14:26:03 | 显示全部楼层
具体说一下, 我的程序中有两个线程A, B,线程A用于更新一个整数percent,线程B读取这个整数,显示窗口中的图片(模仿progress bar)

出现的情况是,A线程更新percent,B线程读取percent并打印它,没有任何错误,且情况正常,

但是B线程中gtk_widget_show (pic)并没有任何作用。直到两个线程全部退出后,图片一下子全都显示出来!!

这两个线程是在一个回调函数中执行。


不知道这是为什么,还请高手指教。
回复 支持 反对

使用道具 举报

发表于 2005-9-27 19:15:47 | 显示全部楼层
一般在显示之前要用gdk_threads_enter ();
而在显示完后要用gdk_threads_leave ();
需要注意的是,在主函数gtk_init (&argc, &argv)之前要调用,g_thread_init (NULL),各  gdk_threads_init ()

举一例如下:
/*-------------------------------------------------------------------------
* Filename:      gtk-thread.c
* Version:       0.99.1
* Copyright:     Copyright (C) 1999, Erik Mouw
* Author:        Erik Mouw <J.A.K.Mouwits.tudelft.nl>
* Description:   GTK threads example.
* Created at:    Sun Oct 17 21:27:09 1999
* Modified by:   Erik Mouw <J.A.K.Mouwits.tudelft.nl>
* Modified at:   Sun Oct 24 17:21:41 1999
*-----------------------------------------------------------------------*/
/*
* Compile with:
*
* cc -o gtk-thread gtk-thread.c `gtk-config --cflags --libs gthread`
*
* Thanks to Sebastian Wilhelmi and Owen Taylor for pointing out some
* bugs.
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <gtk/gtk.h>
#include <glib.h>
#include <pthread.h>

#define YES_IT_IS    (1)
#define NO_IT_IS_NOT (0)

typedef struct
{
  GtkWidget *label;
  int what;
} yes_or_no_args;

G_LOCK_DEFINE_STATIC (yes_or_no);
static volatile int yes_or_no = YES_IT_IS;

void destroy (GtkWidget *widget, gpointer data)
{
  gtk_main_quit ();
}

void *argument_thread (void *args)
{
  yes_or_no_args *data = (yes_or_no_args *)args;
  gboolean say_something;

  for (;;)
    {
      /* sleep a while */
      sleep(rand() / (RAND_MAX / 3) + 1);

      /* lock the yes_or_no_variable */
      G_LOCK(yes_or_no);

      /* do we have to say something? */
      say_something = (yes_or_no != data->what);

      if(say_something)
        {
          /* set the variable */
          yes_or_no = data->what;
        }

      /* Unlock the yes_or_no variable */
      G_UNLOCK (yes_or_no);

      if (say_something)
        {
          /* get GTK thread lock */
          gdk_threads_enter ();

          /* set label text */
          if(data->what == YES_IT_IS)
            gtk_label_set_text (GTK_LABEL (data->label), "O yes, it is!");
          else
            gtk_label_set_text (GTK_LABEL (data->label), "O no, it isn't!");

          /* release GTK thread lock */
          gdk_threads_leave ();
        }
    }

  return NULL;
}

int main (int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *label;
  yes_or_no_args yes_args, no_args;
  pthread_t no_tid, yes_tid;

  /* init threads */
  g_thread_init (NULL);
  gdk_threads_init ();

  /* init gtk */
  gtk_init(&argc, &argv);

  /* init random number generator */
  srand ((unsigned int) time (NULL));

  /* create a window */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  gtk_signal_connect (GTK_OBJECT (window), "destroy",
                      GTK_SIGNAL_FUNC (destroy), NULL);

  gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  /* create a label */
  label = gtk_label_new ("And now for something completely different ...");
  gtk_container_add (GTK_CONTAINER (window), label);
  
  /* show everything */
  gtk_widget_show (label);
  gtk_widget_show (window);

  /* create the threads */
  yes_args.label = label;
  yes_args.what = YES_IT_IS;
  pthread_create (&yes_tid, NULL, argument_thread, &yes_args);

  no_args.label = label;
  no_args.what = NO_IT_IS_NOT;
  pthread_create (&no_tid, NULL, argument_thread, &no_args);

  /* enter the GTK main loop */
  gdk_threads_enter ();
  gtk_main ();
  gdk_threads_leave ();

  return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-28 17:19:38 | 显示全部楼层
谢谢jerboa的回复,现在我的问题解决了!!Thanks
回复 支持 反对

使用道具 举报

发表于 2006-7-4 18:13:42 | 显示全部楼层
gdk_flush()实时更新
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表