Как сделать простое неблокирующее всплывающее окно в консольной программе на C ++? - PullRequest
2 голосов
/ 24 февраля 2011

Я пытаюсь выяснить, в каком наборе инструментов C ++ GUI (+ stdlib + libc) проще всего реализовать такую ​​полезную функцию в обычном приложении командной строки:

void ShowStringWindow(string& s) {
  // ...
}

ShowStringWindow должно отображать окно с редактируемым полем, содержащим строку s.
Он должен немедленно вернуться, чтобы продолжить основной поток.

Примечания:

  • Если основной поток изменяет отображаемую строку, строка также должна измениться. (активная проверка в порядке)
  • Если пользователь редактирует строку (и подтверждает ввод), строка s должна быть обновлена.
  • Вы можете предположить, что основной поток не будет читать или записывать эту строку во время обновления.
  • Следующие вызовы ShowStringWindow добавляют больше похожих окон (или больше виджетов в существующее окно, если это не так уж сложно реализовать).
  • Должно работать в Linux / Ubuntu.

Я был бы очень признателен за рабочий код, но это не обязательно, чтобы быть полезным.

1 Ответ

1 голос
/ 04 марта 2011

Чтобы сделать это с помощью Qt, вам необходимо:

  • Создать мьютекс для строковой переменной.
  • Создать поток, очевидно.
  • СоздатьОбъект QApplication, в этом потоке.(при первом вызове)
  • Установите для "setQuitOnLastWindowsClosed" значение false в QApplication.(при первом вызове)
  • Создайте диалоговое окно и выполните его "exec".

После возврата из функции "exec" вам необходимо:

  • Удалить объект диалога
  • Вызвать QApplication :: instance () -> quit ();
  • Удалить объект QApplication.
  • Завершить поток.

Существует несколько способов обновления данных из основного потока.
Одним из способов будет использование сигналов / слотов с типом подключения в очереди.Используя это, поток пользовательского интерфейса обновляет значение.Ослабление воздействия на основной поток.Однако обратите внимание, что если частота обновления значения слишком высока, например, 2000 раз в секунду, вы можете перейти к опросу значения.Для этого вам может пригодиться QTimer.

Обновление данных в основном потоке должно быть несколько проще, просто заблокируйте мьютекс и вставьте значение.На этом этапе вы можете проверить, является ли значение, которое мы ранее получили из основного потока, текущим значением в основном потоке.Вы заявляли, что это не изменится, но я бы не стал этому доверять:)

Надеюсь, этого достаточно.Мы использовали это для создания диалогового окна ошибки на основе Qt для консольной программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...