感谢您花时间处理我的问题!
我的目标:读取日志文件,将其显示到TextView小部件中,然后每次在文件中添加新行时更新它(非常简单,似乎)
问题:似乎总是满足G_IO_IN条件,即使对于G_STATUS_EOF也是如此。因此,程序挂起并且不显示任何内容。
以下是一些代码摘录:
1,打开文件,阅读并将其显示在TextView中(它完美地运行):
// Get the TextBuffer then go to the latest position (not sure it is useful)
txtBuf=gtk_text_view_get_buffer((GtkTextView *)tvLogs);
gtk_text_buffer_get_end_iter(txtBuf, &txtIter);
// Connect logfile to new IOChannel and add_watch to G_IO_IN condition
chanErr=g_io_channel_new_file("./errorlog.log","r", &error);
g_io_add_watch(chanErr, G_IO_IN, (GIOFunc)DisplayLogs, NULL);
// Read the whole file and display it into the TextView
ret=g_io_channel_read_to_end(chanErr,&file, &fileLen, &err)
g_assert(ret == G_IO_STATUS_NORMAL);
// Insert file read into the TextView
gtk_text_buffer_insert(txtBuf, &txtIter, file, fileLen);
此时,一切运行良好......以下是连接到G_IO_IN条件的回调:
gboolean DisplayLogs(GIOChannel *chanErr, GIOCondition cond, gpointer data)
{
GtkWidget *tvLogs;
gchar *buf;
gsize bufLen;
GError *err=NULL;
GtkTextBuffer *txtBuf;
GtkTextIter txtIter;
GIOStatus ret;
// Retrieve the TextView
tvLogs=GTK_WIDGET(gtk_builder_get_object(builder,(gchar*)"tvLogs"));
g_assert(tvLogs);
// Try to read 1 line
ret=g_io_channel_read_line(chanErr, &buf, &bufLen, NULL, &err);
if (ret!=G_STATUS_NORMAL) {
switch (ret) {
case G_IO_STATUS_ERROR : g_warning("G_IO_STATUS_ERROR"); break;
case G_IO_STATUS_EOF : g_warning("G_IO_STATUS_EOF"); break;
case G_IO_STATUS_AGAIN : g_warning("G_IO_STATUS_AGAIN"); break;
}
if (err)
g_warning(err->message);
}
//
....
other stuff to update info displayed but never reached
//
return TRUE;
}
当应用程序启动时:它在“G_STATUS_EOF”上无限循环。 看来这个事件会触发G_IO_IN条件并触发回调。
有什么想法吗?
非常感谢提前。
问候。
- 文森特
答案 0 :(得分:0)
好吧,既然没有人回答,我必须自己找一个解决方案(这确实是一件好事)。
问题是:如何在TextView中显示来自文件的日志条目。
找到解决方案:
结果很好。我有日志文件和窗口日志。
问题解决了(或者是变通的,取决于:-))
问候。