如何在文件创建时更新 GTK GUI?
How to update a GTK GUI on file creation?
我正在尝试创建一个简单的 GTK 应用程序。一旦某些文件由不同的进程创建,我想在 GUI 上写东西。我想我不能在父进程中执行 while(true)
,因为那样会冻结 GUI。相反,我试图分叉,检查文件是否存在并操作 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();
}
}
当您想执行 I/O 操作时,请查看 gio, which is integrated to GLib. So you should use a GFileMonitor
which uses inotify 以获得文件系统更改的通知。 GFileMonitor
的 "Description" 部分介绍了要使用的函数。
我正在尝试创建一个简单的 GTK 应用程序。一旦某些文件由不同的进程创建,我想在 GUI 上写东西。我想我不能在父进程中执行 while(true)
,因为那样会冻结 GUI。相反,我试图分叉,检查文件是否存在并操作 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();
}
}
当您想执行 I/O 操作时,请查看 gio, which is integrated to GLib. So you should use a GFileMonitor
which uses inotify 以获得文件系统更改的通知。 GFileMonitor
的 "Description" 部分介绍了要使用的函数。