[问题]为什么一个简单的gtk 程序会有这么多问题?

软件和网站开发以及相关技术探讨
回复
antonym55
帖子: 353
注册时间: 2007-04-03 9:52
联系:

[问题]为什么一个简单的gtk 程序会有这么多问题?

#1

帖子 antonym55 » 2007-06-04 12:09

用valgrind 测试一下一个简单的gtk 程序,发现N 多问题

代码: 全选

#include <gtk/gtk.h>

int main(int argc, char * argv[])
{
    /*-- Declare the GTK Widgets used in the program --*/
    GtkWidget *window;

    /*--  Initialize GTK --*/
    gtk_init(&argc, &argv);

    /*-- Create the new window --*/
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    /*-- Display the widgets --*/
    gtk_widget_show(window);

    /*-- Start the GTK event loop --*/
    gtk_main();

    /*-- Return 0 if exit is successful --*/
    return 0;
}
编译选项

代码: 全选

gcc -g -o gtk main.c `pkg-config gtk+-2.0 --cflags --libs`
在终端中运行后,显示GTK窗口,关闭后, 无法正常返回到终端,程序停在 gtk_main(); 里面不出来
只好用Ctrl + C 退出

用valgrind 检测,问题更多。
valgrind ./gtk后的结果, 因无法退出,中途用Ctrl +C 退出
==10423== ERROR SUMMARY: 13 errors from 10 contexts (suppressed: 83 from 1)
==10423== malloc/free: in use at exit: 211,888 bytes in 2,684 blocks.
==10423== malloc/free: 7,720 allocs, 5,036 frees, 747,250 bytes allocated.
==10423== For counts of detected errors, rerun with: -v
==10423== searching for pointers to 2,684 not-freed blocks.
==10423== checked 487,236 bytes.
==10423==
==10423== LEAK SUMMARY:
==10423== definitely lost: 156 bytes in 11 blocks.
==10423== possibly lost: 52,520 bytes in 51 blocks.
==10423== still reachable: 159,212 bytes in 2,622 blocks.
==10423== suppressed: 0 bytes in 0 blocks.
==10423== Use --leak-check=full to see details of leaked memory.
郁闷,还好用的是gtkmm,

下面是gtkmm的测试

代码: 全选

#include <gtkmm.h>

int main(int argc, char *argv[])
{
    Gtk::Main kit(argc, argv);
    
    Gtk::Window window;

    Gtk::Main::run(window);
    
    return 0;
}

问题也不少,不过可以正常返回到终端
==10546== ERROR SUMMARY: 13 errors from 11 contexts (suppressed: 101 from 1)
==10546== malloc/free: in use at exit: 285,393 bytes in 4,958 blocks.
==10546== malloc/free: 10,957 allocs, 5,999 frees, 852,248 bytes allocated.
==10546== For counts of detected errors, rerun with: -v
==10546== searching for pointers to 4,958 not-freed blocks.
==10546== checked 957,976 bytes.
==10546==
==10546== LEAK SUMMARY:
==10546== definitely lost: 156 bytes in 11 blocks.
==10546== possibly lost: 53,024 bytes in 52 blocks.
==10546== still reachable: 232,213 bytes in 4,895 blocks.
==10546== suppressed: 0 bytes in 0 blocks.
==10546== Use --leak-check=full to see details of leaked memory.
一个简单的GTK就有这么多问题,还真是不好用,郁闷...
iltgcl
帖子: 16
注册时间: 2006-08-07 22:52

#2

帖子 iltgcl » 2007-06-05 9:39

你看过gtk教程吗?
antonym55
帖子: 353
注册时间: 2007-04-03 9:52
联系:

#3

帖子 antonym55 » 2007-06-05 10:19

iltgcl 写了:你看过gtk教程吗?
事实上,第一个例子来自
http://www.gtk.org/tutorial/c39.html

第2个例子来自
http://www.gtkmm.org/docs/gtkmm-2.4/doc ... /ch03.html
头像
arthur
帖子: 76
注册时间: 2006-08-13 16:06

#4

帖子 arthur » 2007-06-05 10:55

这不是GTK的问题,这是编程习惯的问题。当然,上面两个都是例子,它们主要是用最简单的代码来说明如何使用GTK。你要想写出比价优雅的程序还是请你认真的去研究一下手册。
iltgcl
帖子: 16
注册时间: 2006-08-07 22:52

#5

帖子 iltgcl » 2007-06-05 12:36

http://www.gtk.org/tutorial/c39.html 中看看后面那个例子,destroy回调函数中调用了gtk_main_quit.问题就在这里!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#6

帖子 eexpress » 2007-06-05 12:45

没destroy。是哦。楼上说了。
● 鸣学
ltkun
帖子: 1340
注册时间: 2006-01-10 19:09

#7

帖子 ltkun » 2007-06-05 13:48

这叫什么来着 断章取义说的就是吧
antonym55
帖子: 353
注册时间: 2007-04-03 9:52
联系:

#8

帖子 antonym55 » 2007-06-05 15:20

iltgcl 写了:http://www.gtk.org/tutorial/c39.html 中看看后面那个例子,destroy回调函数中调用了gtk_main_quit.问题就在这里!
我发贴的时候确实没有注意到前面的那句
This program will create a 200x200 pixel window and has no way of exiting except to be killed by using the shell.
后来也加了对 delete_event的 处理,程序可以正常返回终端,不过问题仍然存在,参见
http://ubuntuforums.org/showthread.php?p=2782936
http://bbs.chinaunix.net/viewthread.php?tid=944789
因为一直在找相关资料,所以就没更新贴子了
版本1

代码: 全选

#include <gtk/gtk.h>

static gboolean delete_event( GtkWidget *widget,
        GdkEvent  *event,
        gpointer   data )
{
    g_print ("delete event occurred,exit window.\n");
    gtk_main_quit();
    return FALSE;
}

int main(int argc, char * argv[])
{
    /*-- Declare the GTK Widgets used in the program --*/
    GtkWidget *window;

    /*--  Initialize GTK --*/
    gtk_init(&argc, &argv);

    /*-- Create the new window --*/
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   
    g_signal_connect (G_OBJECT (window), "delete_event",
            G_CALLBACK (delete_event), NULL);

    /*-- Display the widgets --*/
    gtk_widget_show(window);

    /*-- Start the GTK event loop --*/
    gtk_main();

    /*-- Return 0 if exit is successful --*/
    return 0;
}
版本2

代码: 全选

#include <gtk/gtk.h>

static gboolean delete_event( GtkWidget *widget,
        GdkEvent  *event,
        gpointer   data )
{
    g_print ("delete event occurred,exit window.\n");
    return FALSE;
}
static void destroy( GtkWidget *widget,
                     gpointer   data )
{
    gtk_main_quit ();
}

int main(int argc, char * argv[])
{
    /*-- Declare the GTK Widgets used in the program --*/
    GtkWidget *window;

    /*--  Initialize GTK --*/
    gtk_init(&argc, &argv);

    /*-- Create the new window --*/
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   
    g_signal_connect (G_OBJECT (window), "delete_event",
            G_CALLBACK (delete_event), NULL);

    g_signal_connect (G_OBJECT (window), "destroy",
		      G_CALLBACK (destroy), NULL);

    /*-- Display the widgets --*/
    gtk_widget_show(window);

    /*-- Start the GTK event loop --*/
    gtk_main();

    /*-- Return 0 if exit is successful --*/
    return 0;
}
不知你用的什么参数检测的? 我是用下面的方式检测,还是有些问题

代码: 全选

G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind ./gtk
---------------------------------------8<---------------------------------------------
ltkun 写了:这叫什么来着 断章取义说的就是吧
形而上学??
回复