2017-12-18 4 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操作を実行したいです、 GLibに統合されているgioを見てください。したがって、ファイルシステムの変更を通知するには、inotifyを使用するGFileMonitorを使用する必要があります。 GFileMonitorの「説明」セクションには、使用する機能が示されています。

関連する問題