忘记过去 发表于 2006-8-1 10:59:11

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

我做的界面上有个notebook构件,上面有4页,分别显示不同的信息。主程序就是读串口上传递过来信息,并显示在界面上。但是现在只有当有数据传来并显示的时候,notebook上才可以用鼠标打开这4页查看信息,等到数据读完了,那4页又点不动了,不知道怎么回事。
    请问大家这是什么原因阿?

BOoRFGOnZ 发表于 2006-8-1 12:20:36

:shock:

mozilla 发表于 2006-8-2 11:41:10

如果是gtk的话:callback函数里不要有会导致阻塞的代码,如果有,可以开一个线程来处理

忘记过去 发表于 2006-8-2 22:05:48

我在主函数main.c先是创建了window(包含个notebook构件),然后开了个线程来读串口,然后在读串口函数里用了一个gtk_timeout_add函数来调用显示函数。楼上的意思我要在哪里开个线程呢?

mozilla 发表于 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)就用不了了,界面死了 :cry:
请问大家这是哪里的错误呢?

mozilla 发表于 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为什么是死的我认为是读串口占用了太大的内存,不知道我这样认为对不对,怎么修改呢?

mozilla 发表于 2006-8-3 20:59:35

gtk_main()是gtk主循环

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

忘记过去 发表于 2006-8-3 21:24:24

在创建的线程里我也用了gtk_timeout_add()来每200毫秒调用读串口(包含select函数)!

mozilla 发表于 2006-8-3 21:30:26


#include <gtk/gtk.h>
staticGtkWidget *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;
}

忘记过去 发表于 2006-8-3 22:27:53

我编译运行了这个小程序,就是一个entry里每100毫秒就增加1,请问这个程序有什么意义呢,是说明gtk_main()的吗?那我懂这个,但是跟我的问题有什么关系呀?

mozilla 发表于 2006-8-4 08:51:00

说明gtk_timeout_add可以用来刷新界面

忘记过去 发表于 2006-8-4 16:46:08

都怪我没说清楚 :oops:

给你看一下我的代码吧:


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;
}






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

mozilla 发表于 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用一次就能让它每半秒执行一次。
页: [1] 2
查看完整版本: 界面上的notebook构件不能翻页?