+ -
当前位置:首页 → 问答吧 → gtk的多线程问题

gtk的多线程问题

时间:2010-07-29

来源:互联网

  1. #!/bin/env perl

  2. use strict;
  3. use warnings;
  4. use threads;
  5. use Gtk2;
  6. use Glib qw(TRUE FALSE);
  7. $|++;
  8. my $str = 'test';
  9. Gtk2::Gdk::Threads->init();
  10. Gtk2->init();
  11. my $window= Gtk2::Window->new("toplevel");
  12. $window->signal_connect(delete_event => sub { Gtk2->main_quit(); });
  13. $window->set_border_width(10);
  14. my $button = Gtk2::Button->new_with_label("Hello World");
  15. $button->signal_connect(clicked => \&new_thread);
  16. $window->add($button);
  17. $window->show_all();

  18. Gtk2::Gdk::Threads->enter();
  19. Gtk2->main();
  20. Gtk2::Gdk::Threads->leave();

  21. ##############################################

  22. sub hello()
  23. {
  24.         print "sad:$str\n";
  25. }

  26. sub thread_begin()
  27. {
  28.         hello();
  29.         my $t = threads->create(\&test);
  30.         $t->detach();
  31. }

  32. sub test()
  33. {
  34. #                Gtk2::Gdk::Threads->enter();
  35.                 print "weigun\n";
  36. #                Gtk2::Gdk::Threads->leave();
  37. }
复制代码
下面这两句,无论注释与否都不行····
#                Gtk2::Gdk::Threads->enter();
#                Gtk2::Gdk::Threads->leave();
那个按钮按了第二次就出错了···一大堆错误·····程序的输出信息如下:

sad:test
weigun
sad:test
weigun
GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-WARNING **: instance of invalid non-instantiatable type `<invalid>' at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-CRITICAL **: g_signal_emit_valist: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-WARNING **: instance of invalid non-instantiatable type `<invalid>' at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-CRITICAL **: g_signal_handlers_destroy: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-WARNING **: instance of invalid non-instantiatable type `<invalid>' at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-CRITICAL **: g_signal_handlers_destroy: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed at D:\test-area\gtk_test\gtk_threads.pl line 23.
Usage: Glib::Object:ESTROY(sv) at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-WARNING **: instance with invalid (NULL) class pointer at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-CRITICAL **: g_signal_handlers_destroy: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-WARNING **: instance with invalid (NULL) class pointer at D:\test-area\gtk_test\gtk_threads.pl line 23.
GLib-GObject-CRITICAL **: g_signal_handlers_destroy: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed at D:\test-area\gtk_test\gtk_threads.pl line 23.

============================================
一头雾水···所以··求高手解释····谢谢··

作者: wfnh   发布时间: 2010-07-29

沙发·顶··一个·

作者: wfnh   发布时间: 2010-07-29