如何使用Gnome GIO以非阻塞方式通过块读取文件?

时间:2016-08-27 18:50:42

标签: c asynchronous chunks gio

以非阻塞方式和chunk-by-chunk处理GInputStream的正确方法(GIO / Glib / GTK / Gnome)是什么?

我有一个应用程序正在下载(通过libsoup)并以块的形式处理数据流并并行执行其他操作。我在GInputStream上调用g_input_stream_read_async(从soup_session_send_finish接收并给它一个合理大小的块来读取(在我的情况下为2048字节)。

收到g_input_stream_read_async回调后,我想继续读取字节。所以,第一个想法是从回调处理程序递归调用g_input_stream_read_async,将自身作为下一个回调传递。但这对我来说似乎很笨拙而且不太合适(而且我不确定将目前仍在执行的回调传递给GIO是否安全。)

替代方法可能是分离一个线程并在调用g_input_stream_read的循环中执行通常的阻塞读取。

但是它通常是如何在GTK / Gnome世界中完成的?什么是正确的方法?任何简单的工作示例(最好是与GTK / Gnome相关的开发人员)都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

  

收到g_input_stream_read_async回调后,我想继续读取字节。所以,第一个想法是从回调处理程序递归调用g_input_stream_read_async,将其自身作为下一个回调传递。

这是有效且运作良好。