西山和広です。
内容が変化するpopup menuのためGtk::Menuを繰り返し生成していると、
*** glibc detected *** corrupted double-linked list: 0x083700f0 ***
などで落ちることがあるのですが、何が原因なのでしょうか?
環境はDebian etchで、libgtk2-rubyは0.15.0-1.1で、
% ruby1.8 -v
ruby 1.8.5 (2006-08-25) [i486-linux]
% ruby1.8 -r gtk2 -e 'p Gtk::VERSION'
[2, 8, 20]
%
となっています。
この環境で以下のプログラムを実行していると5〜10秒ぐらいで
落ちます。
#!/usr/bin/ruby1.8 -Ku
# -*- coding: utf-8 -*-
require 'gtk2'
def popup_menu
return @popup_menu if @popup_menu
@popup_menu = Gtk::Menu.new
quit_menu_item = Gtk::MenuItem.new("_Quit")
quit_menu_item.signal_connect("activate") do
Gtk.main_quit
end
@popup_menu.append(quit_menu_item)
@popup_menu.show_all
return @popup_menu
end
def start_check
Gtk.timeout_add(5) do
if @popup_menu and not @using_popup
menu = @popup_menu
@popup_menu = nil
p menu
menu.destroy
#GC.start
end
popup_menu
true
end
end
def start_gtk_window
@window = Gtk::Window.new
@window.show_all
@window.add_events(Gdk::Event::BUTTON_PRESS_MASK)
@window.signal_connect("destroy") do
Gtk.main_quit
end
@window.signal_connect("button_press_event") do |widget, event|
case event.button
when 1
@using_popup = false
when 3
@using_popup = true
popup_menu.popup(nil, nil, event.button, event.time)
end
end
end
Gtk.init
start_gtk_window
start_check
Gtk.main
--
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)
|