2012-04-25 21 views
2

這是一個關於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

回答

2

您可以通過要求主循環爲您運行其他任務來執行其他任務。如果您使用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

0

你能否提供一些關於你的程序在做什麼的細節?你目前的描述很模糊,很難真正理解你在問什麼。

以下是一些基於我對原始問題的解釋的通用建議。

你說你的程序「是一個服務器/客戶端應用程序,所以它必須在後臺運行,如果有一個小GUI」。請注意,服務器通常沒有集成的GUI;它們通常被設計爲在後臺無聲無息地運行。擁有用於配置或檢查服務器狀態的圖形界面並不罕見,但它傳統上是作爲單獨的獨立應用程序(各種客戶端)實現的,它們僅連接到服務器以檢索狀態信息併發送配置命令。您將不會在服務器運行的整個時間內運行GUI,因此您不希望服務器承受額外的開銷。

就您的客戶而言,GUI通常使用回調來實現。當一個UI小部件被創建時,它會被賦予一個指向一個函數的指針,當這個小部件被點擊,修改或以其他方式操作時,該函數將被調用。有時候,這個回調函數會簡單地更新另一個UI小部件並返回,有時可能需要一個新的線程來生成更復雜的東西。同樣,這在很大程度上取決於您的GUI和應用程序正在嘗試做什麼。

+0

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