当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]为什么一个简单的gtk 程序会有这么多问题?
帖子发表于 : 2007-06-04 12:09 
头像

注册: 2007-04-03 9:52
帖子: 353
送出感谢: 0 次
接收感谢: 0 次
用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就有这么多问题,还真是不好用,郁闷...


_________________
TODO LIST:
1.valgrind:
2.gcov:
3.cppuint:未在Linux中使用
4.PostgreSQL:unixODBC
5.Doxygen:UTF8 中文问题,生成LaTex文档问题
6.LaTex:明确安装问题,UTF8 中文字体问题


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-06-05 9:39 

注册: 2006-08-07 22:52
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
你看过gtk教程吗?


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-06-05 10:19 
头像

注册: 2007-04-03 9:52
帖子: 353
送出感谢: 0 次
接收感谢: 0 次
iltgcl 写道:
你看过gtk教程吗?


事实上,第一个例子来自
http://www.gtk.org/tutorial/c39.html

第2个例子来自
http://www.gtkmm.org/docs/gtkmm-2.4/doc ... /ch03.html


_________________
TODO LIST:
1.valgrind:
2.gcov:
3.cppuint:未在Linux中使用
4.PostgreSQL:unixODBC
5.Doxygen:UTF8 中文问题,生成LaTex文档问题
6.LaTex:明确安装问题,UTF8 中文字体问题


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-06-05 10:55 
头像

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


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-06-05 12:36 

注册: 2006-08-07 22:52
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
http://www.gtk.org/tutorial/c39.html 中看看后面那个例子,destroy回调函数中调用了gtk_main_quit.问题就在这里!


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-06-05 12:45 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
没destroy。是哦。楼上说了。


_________________
● 鸣学


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-06-05 13:48 

注册: 2006-01-10 19:09
帖子: 1334
送出感谢: 0 次
接收感谢: 0 次
这叫什么来着 断章取义说的就是吧


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-06-05 15:20 
头像

注册: 2007-04-03 9:52
帖子: 353
送出感谢: 0 次
接收感谢: 0 次
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 写道:
这叫什么来着 断章取义说的就是吧

形而上学??


_________________
TODO LIST:
1.valgrind:
2.gcov:
3.cppuint:未在Linux中使用
4.PostgreSQL:unixODBC
5.Doxygen:UTF8 中文问题,生成LaTex文档问题
6.LaTex:明确安装问题,UTF8 中文字体问题


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译