2017-12-18 274 views
0

我正在尝试创建一个简单的GTK应用程序。只要某些文件是由不同的进程创建的,我就想在GUI上写东西。我想我不能在父进程中执行while(true),因为这会冻结GUI。相反,我想叉,检查文件是否存在,并控制GUI,但它似乎没有工作,我笨拙的代码如下:如何在创建文件时更新GTK GUI?

int check_for_files(){ 
FILE *fp; 
int files_set; 
char ch; 

files_set = 0; 
while(!files_set){ 
    fp = fopen("file", "r"); 
    if(fp != NULL){ 
    content_length = 0; 
    while(ch=getc(fp) != EOF){ 
     content_length++; 
    } 
    fclose(fp); 
    files_set = 1; 
    return files_set; 
    } 
    else{ 
    files_set = 0; 
    } 
} 
    return 1; 
} 

int main(int argc, char *argv[]) { 
// Main function the get the application UI 

GtkWidget *window; 
GdkPixbuf *icon; 
GtkWidget *grid; 


gtk_init(&argc, &argv); 
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
gtk_window_set_default_size(GTK_WINDOW(window), 500, 300); 
gtk_container_set_border_width(GTK_CONTAINER(window), 15); 
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 

int pid = fork(); 

if (pid == 0){ 
    int files_set = check_for_files(); 
    printf("files outside: %d\n",files_set); 
    gtk_window_set_title(GTK_WINDOW(window), "Files are present!"); 
} 
else{ 
    icon = create_pixbuf("net.png"); 
    gtk_window_set_icon(GTK_WINDOW(window), icon); 
// Get the grid 
    get_grid(window); 
    gtk_widget_show_all(window); 
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); 
    g_object_unref(icon); 
    gtk_main(); 
    } 
} 
+0

您应该在主线程中执行所有GUI更新。如果你在另一个线程中检测到一些变化。为此,'g_idle_add()'是你的朋友。 – Gerhardh

回答

3

当您要执行I/O操作,看看gio,这是集成到GLib。所以你应该使用GFileMonitor,它使用inotify来通知文件系统的变化。 GFileMonitor的“说明”部分介绍了要使用的功能。

相关问题