gpt4 book ai didi

c - GTK IOChannel - 如何处理G_IO_IN事件

转载 作者:行者123 更新时间:2023-11-30 16:36:40 24 4
gpt4 key购买 nike

感谢您花时间回答我的问题!

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

有什么想法吗?

提前非常感谢。

问候。

--文森特

最佳答案

好吧,既然没有人回答,我就得自己想办法了(这确实是一件好事)。

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

找到解决方案:

  1. 为了生成日志,应用程序使用 zlog API,因此我没有监视日志文件、读取新条目并将其显示在 TextView 中,而是执行了以下操作:
  2. 在 zlog API 中添加自定义输出回调(该 API 的功能非常好)
  3. 回调只是将 zlog 格式的消息(日期 - 时间 - 功能 - 严重性 - 消息)“打印”到 TextView 小部件的末尾。
  4. 同时,ZLog 将消息写入日志文件(由于 zlog.conf 文件)。

结果很好。我有日志文件和窗口日志。

问题已解决(或解决方法,具体取决于:-))

问候。

关于c - GTK IOChannel - 如何处理G_IO_IN事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48322694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com