GTK + C中的GUI,第一步

问题描述:

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

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

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


这是很难解释它在意大利,在英语中是更坏:)

该方案有听汽车无网络(LAN),看看其他用户到达,赶上他们的UDP消息,同时如果某些条件得到验证,它必须与特定用户进行通信(例如,如果本地文件夹中的文件发生更改,则必须将此文件发送给指定用户。这可能会发生在同时)。我只有一个应用程序必须是服务器(发送文件)和客户端(同时收听网络)。

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

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

+1

你究竟是什么意思:“我的程序是服务器/客户端应用程序”?它是连接到服务器(这是一个不同的程序)的客户端?或者运行同一个程序的两个实例,其中一个是客户端,另一个是服务器? – ArjunShankar 2012-04-25 15:44:10

+0

Next:“我应该使用fork()同时执行其他任务吗?”除了运行GUI之外,还有哪些其他任务要做? – ArjunShankar 2012-04-25 15:44:52

+0

下一个:“所以它必须在后台运行,如果有一个小GUI”:这是什么意思?我不清楚。 – ArjunShankar 2012-04-25 15:45:25

您可以通过要求主循环为您运行其他任务来执行其他任务。如果您使用GIO执行IO操作,则会自动处理(请参阅http://developer.gnome.org/gio/stable/)。 http://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html也许g_io_add_watch()在这里:如果你需要做阻塞的IO(像读http://developer.gnome.org/glib/stable/glib-IO-Channels.html

(但在一般情况下,你将这里描述的使用功能,如g_idle_add(),g_timeout_add()等。 )/ fread()调用),那么你必须产生一个线程,并通过添加一个空闲处理程序让该线程回到GUI循环。如果你对主循环或线程不熟悉,这很难理解,所以使用GIO是一个更好的选择,因为它为你做了这些。

你也可以使用fork()来产生一个进程来完成你的IO,但是你需要使用IO来和你的进程通信,所以你不能真正避免在UI进程中做IO。

+0

有了这个方法,我可以使用我已经写过的函数,或者我必须重写它们吗? – phcaze 2012-04-26 05:22:30

+0

这实际上取决于你写的东西;-) – 2012-04-26 15:12:34

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

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

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

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

+0

在GTK网站上也有一些教程可能对你有所帮助:http://developer.gnome.org/gnome-devel-demos/unstable/ – bta 2012-04-25 16:37:39