GTK IOChannel - 如何处理G_IO_IN事件

时间:2018-01-18 13:37:57

标签: c gtk3 glib

感谢您花时间处理我的问题!

我的目标:读取日志文件,将其显示到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条件并触发回调。

有什么想法吗?

非常感谢提前。

问候。

- 文森特

1 个答案:

答案 0 :(得分:0)

好吧,既然没有人回答,我必须自己找一个解决方案(这确实是一件好事)。

问题是:如何在TextView中显示来自文件的日志条目。

找到解决方案:

  1. 要生成日志,应用程序使用zlog API,而不是查看日志文件,阅读新条目并在textview中显示它们,我已完成以下操作:
  2. 在zlog API中添加自定义输出回调(API的非常好的功能)
  3. 回调只是将zlog格式化消息(日期 - 时间 - 函数 - severtity - 消息)“打印”到TextView小部件的末尾。
  4. 同时,ZLog将消息写入日志文件(由于zlog.conf文件)。
  5. 结果很好。我有日志文件和窗口日志。

    问题解决了(或者是变通的,取决于:-))

    问候。