2017-12-18 3 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의 "설명"섹션에는 사용할 기능이 나와 있습니다.

관련 문제