找回密码
 注册
查看: 1960|回复: 18

界面上的notebook构件不能翻页?

[复制链接]
发表于 2006-8-1 10:59:11 | 显示全部楼层 |阅读模式
我做的界面上有个notebook构件,上面有4页,分别显示不同的信息。主程序就是读串口上传递过来信息,并显示在界面上。但是现在只有当有数据传来并显示的时候,notebook上才可以用鼠标打开这4页查看信息,等到数据读完了,那4页又点不动了,不知道怎么回事。
    请问大家这是什么原因阿?
发表于 2006-8-1 12:20:36 | 显示全部楼层
回复

使用道具 举报

发表于 2006-8-2 11:41:10 | 显示全部楼层
如果是gtk的话:callback函数里不要有会导致阻塞的代码,如果有,可以开一个线程来处理
回复

使用道具 举报

 楼主| 发表于 2006-8-2 22:05:48 | 显示全部楼层
我在主函数main.c先是创建了window(包含个notebook构件),然后开了个线程来读串口,然后在读串口函数里用了一个gtk_timeout_add函数来调用显示函数。楼上的意思我要在哪里开个线程呢?
回复

使用道具 举报

发表于 2006-8-3 09:30:38 | 显示全部楼层
gtk_timeout_add是周期性的,你不断的用这个?
回复

使用道具 举报

 楼主| 发表于 2006-8-3 11:11:15 | 显示全部楼层
是啊,因为我以前问过如何让entry里的内容不断的显示,有人回复我说要用到gtk_timeout_add这个函数啊,而且我用着也挺好的!
我把我的main函数的结构大致描述一下好了:
main()
{
gtk_init();系统初始化;
串口的初始化;
然后创建了一个window,上面是一个4页的notebook(每一页都有大量的label和entry),下面是很多label和entry要显示数据.
然后创建了一个线程调用读串口函数(用到了select函数,阻塞时间我设定为了60秒)来读串口,被调用读串口函数里用到了一个gtk_timeout_add函数用来隔400毫秒就显示一下数据.
(下面我就不知道写的对不对了 :-( )
pthread_join(pt_R,&status);
gtk_main();
return FALSE;
}
结果程序运行起来,只有当有数据读进来并显示的时候,notebook才能翻页,无数据读到和数据读完之后,notebook就死了,说的具体点应该是界面(window)就用不了了,界面死了
请问大家这是哪里的错误呢?
回复

使用道具 举报

发表于 2006-8-3 13:08:26 | 显示全部楼层
pthread_join不能放在gtk_main前面吧,它会等待线程结束的,这样就走不到gtk_main()那了。
gtk_timeout_add用一次就行的,然后它设定的函数就会被一遍一遍的执行。
gtk_timeout可以用来做刷新界面用。
串口数据可以开一条线程来读。
回复

使用道具 举报

 楼主| 发表于 2006-8-3 20:48:07 | 显示全部楼层
一.说实话,那个gtk_main()什么时候和怎么执行到那里我还真是不明白,本来就是main函数,为什么还要写上gtk_main()呢?
二. 我把gtk_timeout函数放在主程序里用来显示数据,结果根本就显示不出来,只能放在那个读串口并解码函数里.至于我的window为什么是死的我认为是读串口占用了太大的内存,不知道我这样认为对不对,怎么修改呢?
回复

使用道具 举报

发表于 2006-8-3 20:59:35 | 显示全部楼层
gtk_main()是gtk主循环

gtk_timeout_add()肯定可以用来刷新界面
回复

使用道具 举报

 楼主| 发表于 2006-8-3 21:24:24 | 显示全部楼层
在创建的线程里我也用了gtk_timeout_add()来每200毫秒调用读串口(包含select函数)!
回复

使用道具 举报

发表于 2006-8-3 21:30:26 | 显示全部楼层
[code:1]
#include <gtk/gtk.h>
static  GtkWidget *entry;
static int i=0;
gboolean timeout_callback(gpointer data)
{
         char buf[12];
         sprintf(buf,"%d",i);
         gtk_entry_set_text(entry,buf);
         i++;
         return TRUE;
}
int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    int tm;
    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    entry = gtk_entry_new();
    gtk_container_add(GTK_CONTAINER(window),entry);
    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_show_all(window);
    tm = gtk_timeout_add(100,timeout_callback,NULL);
    gtk_main ();
    gtk_timeout_remove(tm);
    return 0;
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2006-8-3 22:27:53 | 显示全部楼层
我编译运行了这个小程序,就是一个entry里每100毫秒就增加1,请问这个程序有什么意义呢,是说明gtk_main()的吗?那我懂这个,但是跟我的问题有什么关系呀?
回复

使用道具 举报

发表于 2006-8-4 08:51:00 | 显示全部楼层
说明gtk_timeout_add可以用来刷新界面
回复

使用道具 举报

 楼主| 发表于 2006-8-4 16:46:08 | 显示全部楼层
都怪我没说清楚

给你看一下我的代码吧:

[code:1]
int main(int argc,char *argv[])
{
gtk_init(&argc,&argv);
serial_set();//设置串口

window=create_window();//创建了一个window界面
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show_all(window);

pthread_create(&pt_R,NULL,(void *)&pt_Read,NULL);//开辟了一个线程

gtk_main();
pthread_join(pt_R,&status);

gtk_timeout_remove(timer_read);//移走读串口的计时器
gtk_timeout_remove(timer_show);//移走显示的计数器

return FALSE;
}


//线程函数
void *pt_Read(void *arg)
{
//每200毫秒读一次串口
timer_read=gtk_timeout_add(200,(GtkFunction)Dispatch,NULL);
return;
}



//读串口函数
void Dispatch()
{
//读串口
......
......

//调用另外一个gtk_timeout_add去显示数据
timer_show=gtk_timeout_add(500,(GtkFunction)show_data,NULL);

return;
}


[/code:1]



这是我的main函数的主要内容,现在的问题是可以读到数据,可以显示数据,就是那个界面只是在有数据读到和显示的时候可以点击察看notebook的各页的详细内容,但是等到数据读完和数据没有读入的时候,界面是死的
回复

使用道具 举报

发表于 2006-8-4 20:39:53 | 显示全部楼层
1。timer_read=gtk_timeout_add(200,(GtkFunction)Dispatch,NULL); 放到线程里没有意义

2。你为什么要在Dispatch里调用timer_show=gtk_timeout_add(500,(GtkFunction)show_data,NULL); ?逻辑本身就有问题!对于show_data来说,gtk_timeout_add用一次就能让它每半秒执行一次。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2025-2-6 21:05 , Processed in 0.028708 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

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