2

这是关于 GUI 的一般问题。我从来没有用 GUI 写过程序,现在我必须为大学做。我发现 C 语言中最好的解决方案编程是 GTK+。

我看到很多例子,但我仍然无法理解一件事。我的程序是一个服务器/客户端应用程序,所以如果有一个小的 GUI,它也必须在后台运行。怎么可能实现?我看到要“启动”我必须使用 gtk_main() 循环的人,并且该循环内的应用程序一直阻塞。我应该使用 fork() 同时执行其他任务吗?

谢谢,对不起,如果这是一个微不足道的问题。


用意大利语很难解释,用英语更糟糕:)

程序必须连续监听网络(LAN),查看其他用户是否到达并捕获他们的 UDP 消息,同时如果某些条件得到验证,它必须与特定用户通信(例如,如果文件在本地文件夹发生变化,它必须将此文件发送给指定的用户。这可能同时发生在多个用户身上)。我只有一个应用程序必须同时是服务器(发送文件)和客户端(监听网络)。

拥有一个单独的“客户端”来实现 GUI 的想法可能很有趣。

我从来没有开发过 GUI,所以我想写我所有的程序,然后在最后添加 GUI。这是可能的?

4

2 回答 2

2

您可以通过要求主循环为您运行其他任务来运行它们。如果您使用 GIO 进行 IO,这将自动处理(请参阅http://developer.gnome.org/gio/stable/)。但在一般情况下,您将使用 g_idle_add()、g_timeout_add() 等函数,如下所述:http: //developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html也许 g_io_add_watch() 在这里:http: //developer.gnome.org/glib/stable/glib-IO-Channels.html

如果您需要阻塞 IO(类似于 read()/fread() 调用),那么您必须生成一个线程并通过添加一个空闲处理程序让该线程与 GUI 循环通信。如果您是主循环或线程的新手,这很难理解,因此使用 GIO 是一个更好的选择,因为它可以为您做这件事。

您也可以使用 fork() 生成一个进程来执行您的 IO,但是您需要使用 IO 与您的进程进行通信,因此您无法真正避免在 UI 进程中执行 IO。

于 2012-04-25T16:13:38.227 回答
0

你能提供一些关于你的程序具体做什么的细节吗?你目前的描述很模糊,很难真正理解你在问什么。

这是基于我对原始问题的解释的一些通用建议。

你说你的程序“是一个服务器/客户端应用程序,所以如果有一个小的 GUI,它也必须在后台运行”。请注意,服务器通常没有集成的 GUI;它们通常被设计为在后台静默且不可见地运行。具有用于配置或检查服务器状态的图形界面并不少见,但它传统上实现为单独的独立应用程序(各种客户端),它仅连接到服务器以检索状态信息并发送配置命令。您不会让 GUI 在服务器运行的整个过程中都在运行,因此您不希望服务器承受额外的开销。

就您的客户端而言,GUI 通常使用回调来实现。创建 UI 小部件时,会为其提供一个指向函数的指针,该函数将在该小部件被单击、修改或以其他方式执行时调用。有时该回调函数会简单地更新另一个 UI 小部件并返回,有时它可能需要生成一个新线程以执行更复杂的操作。同样,这在很大程度上取决于您的 GUI 和应用程序正在尝试做什么。

于 2012-04-25T16:29:10.200 回答