如何制作从 TCP 套接字接收数据的 GTK 应用程序

How to make a GTK application that receives data from a TCP socket

我正在构建一个 GUI(使用 C),它从另一个通过 TCP 套接字发送数据的应用程序接收要显示的数据。我如何使用 GTK 执行此操作(只是我应该采用的方法的一般概述)?我进行了大量搜索并遇到了有关多线程、GIO 通道等的内容。现在我比以往任何时候都更加困惑。似乎没有关于如何实际实现这一目标的任何结论性文章或指南。

基本上有一个重要规则:

您必须从主线程调用所有 gtk_* 函数。

如果您从另一个线程更新任何小部件,您可能会得到不一致的结果。

当然,您不想在该线程中等待 TCP 数据。

因此我建议您创建一个单独的线程来进行通信。在此线程中,您可以等待数据,如果您有任何会影响您在 GUI 中显示的内容,您可以告诉主线程执行所需的工作。

一个简单的方法是使用 g_idle_add() 将回调函数加入队列。然后在主线程的上下文中执行该回调函数,并可以更新您的小部件。 需要更新的信息可以存储在传递给此回调的一些新分配的内存中,之后您必须在其中释放它。