2012-04-25 2 views
2

Это общий вопрос о GUI. Я никогда не писал программу с графическим интерфейсом, и теперь я должен сделать это для Университета. Я обнаружил, что лучшим решением на C является GTK +.GUI в C с GTK +, первые шаги

Я вижу много примеров, но я все еще не могу понять одну вещь. Моя программа является серверным/клиентским приложением, поэтому она также должна работать в фоновом режиме, если есть небольшой графический интерфейс. Как это можно реализовать? Я вижу, что для «запуска» парня я должен использовать цикл gtk_main(), и приложение блокирует внутри этого цикла все время. Должен ли я использовать fork() для выполнения других задач одновременно?

Спасибо, извините, если это тривиальный вопрос.


Это трудно объяснить на итальянском, на английском даже худший :)

Программа должна слушать бесступенчатой ​​сеть (LAN), чтобы увидеть, если другие пользователи прибывает и поймать их UDP сообщения, и в то же время он должен сообщаться конкретному пользователю, если некоторые условия проверяются (например, если файл в локальной папке изменяется, он должен отправить этот файл назначенному пользователю. Это может произойти с несколькими пользователями на в то же время). У меня есть только одно приложение, которое одновременно должно быть сервером (отправка файлов) и клиентом (прослушивание сети).

Идея иметь отдельный «клиент», который реализует GUI, может быть интересным.

Я никогда не разрабатывал графический интерфейс, поэтому я решил написать всю свою программу, а затем добавить графический интерфейс в конце. Возможно?

+1

Что именно вы подразумеваете под: «Моя программа - приложение для сервера/клиента»? Это клиент, который подключается к серверу (это другая программа)? Или два экземпляра одной и той же программы, где один клиент, а один - сервер? – ArjunShankar

+0

Далее: «Должен ли я использовать fork() для выполнения других задач одновременно?» Какие еще задачи вы хотите сделать, помимо запуска графического интерфейса? – ArjunShankar

+0

Далее: «поэтому он должен работать в фоновом режиме, если есть небольшой графический интерфейс»: что вы подразумеваете под этим? Я не понимаю. – ArjunShankar

ответ

2

Вы можете запускать другие задачи, запросив основной цикл, чтобы запустить их для вас. Это выполняется автоматически, если вы выполняете IO с помощью GIO (см. 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 (что-то вроде чтения ()/fread()), тогда вам нужно создать поток и связать этот поток с контуром GUI, добавив обработчик простоя. Это сложно понять, если вы новичок в основных циклах или потоках, поэтому использование GIO является превосходным вариантом, поскольку это делает это для вас.

Вы также можете использовать fork() для создания процесса ввода-вывода, но тогда вам нужно использовать IO для связи с вашим процессом, поэтому вы не можете избежать необходимости выполнять ввод-вывод в процессе пользовательского интерфейса.

+0

С помощью этого метода я могу использовать функцию, которую я уже написал, или мне нужно переписать их? – phcaze

+0

Это действительно зависит от того, что вы написали ;-) –

0

Можете ли вы предоставить некоторые сведения о том, что конкретно делает ваша программа? Ваше текущее описание достаточно неопределенно, что трудно понять, что вы просите.

Вот несколько общих советов, основанных на моей интерпретации исходного вопроса.

Вы сказали, что ваша программа «является серверным/клиентским приложением, поэтому она должна работать в фоновом режиме, если есть небольшой графический интерфейс». Обратите внимание: серверы обычно не имеют встроенных графических интерфейсов; они обычно предназначены для бесшумно и незаметно работать в фоновом режиме. Нередко есть графический интерфейс для настройки или проверки состояния сервера, но он традиционно реализуется как отдельное автономное приложение (клиентский тип), который просто подключается к серверу для получения информации о состоянии и отправки команд конфигурации. У вас не будет GUI, выполняющего все время работы сервера, поэтому вы не хотите, чтобы сервер был обременен дополнительными накладными расходами.

Что касается вашего клиента, GUI обычно реализуются с использованием обратных вызовов.Когда виджет пользовательского интерфейса создается, ему присваивается указатель на функцию, которая будет вызываться всякий раз, когда виджет будет нажат, изменен или иным образом будет действовать. Иногда эта функция обратного вызова будет просто обновлять другой виджет пользовательского интерфейса и возвращаться, а иногда может потребоваться создание нового потока для выполнения чего-то более сложного. Опять же, это будет во многом зависеть от того, что ваши GUI и приложение пытаются сделать.

+0

На веб-сайте GTK также есть несколько руководств: http://developer.gnome.org/gnome-devel-demos/unstable/ – bta

Смежные вопросы