Как связать родительский процесс из дочернего в QT (C ++) с методом из класса? - PullRequest
2 голосов
/ 17 марта 2011

У меня есть вопрос. В настоящее время я работаю над программой на QT (C ++), и у меня есть эта проблема. Если я установлю флажок, он запустит метод, в котором будет реализован fork (). Родительский процесс продолжается до конца (чтобы сохранить незамерзший графический интерфейс). Дочерний процесс работает в цикле ifinite. После завершения последовательности я сохраняю необходимые данные в общей памяти. Теперь мне нужно связаться с родительским процессом для чтения данных из общей памяти и печати в графическом интерфейсе. Я пробовал сигналы, каналы, семафоры ... Моя проблема в том, что ... Мне нужно связаться с родительским процессом, и мне нужно отвести его в класс, где есть метод для вывода вывода GUI. Если я использую обработчик сигнала, у меня нет шансов вернуться в класс (мне нужен идентификатор общей памяти для подключения). Я надеюсь, что мой вопрос немного понятен. Мне нужно найти решение, где я могу связаться с родительским процессом (что-то вроде connect () в QT) и вызвать необходимый метод из класса.

Ответы [ 2 ]

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

Вы можете использовать сообщения ( mq man pages ), или вы можете сделать опрос.Если установлено значение с определенным смещением в общей памяти, это означает, что дочерний процесс завершен, а данные в общей памяти готовы.

0 голосов
/ 17 марта 2011

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

После завершения процесса, если объем данных невелик, потокобезопасный сигнал можетиспользоваться для передачи данных в поток GUI, а слот в потоке GUI может обновлять отображение.Если данных много (как вы подразумеваете в своем вопросе), сделайте общую память доступной для обоих (либо располагая ее в отдельном модуле, либо используя указатель, созданный при создании объекта QThread), и защитите доступ кпамять с общим QMutex .Этот QMutex может быть создан в потоке GUI и затем передан в рабочий поток при его создании.Когда данные готовы к обработке, поток-безопасный сигнал может быть отправлен из рабочего потока в поток GUI, и слот в потоке GUI может заблокировать (или попытаться заблокировать) QMutex, взять данные из общей памяти и затем разблокироватьQMutex (и, возможно, отправить сигнал обратно рабочему потоку, чтобы он продолжал).

...