Форум программистов, компьютерный форум, киберфорум
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 1
Регистрация: 15.02.2012
Сообщений: 13
1

QT GUI + Fork()/pthread

15.02.2012, 15:32. Просмотров 2575. Ответов 12
Метки нет (Все метки)


Есть гуи. На вход поступает n исполняемых бинарников. Для каждого создается fork() для распараллеливания выполнения. Как написано на многих форумах с ГУИ я общаться могу только из материнского процесса. И так пара проблем: создать динамически расширяющийся список всех процессов (имен пакетов). Вроде append в textbox и все ясно, но если "движок" (создающий все фоки) находится в отдельном потоке, он пишет только один раз. Второй append (при добавлении нового пакета) либо не работает, либо выдает ошибку.
Проблема 2: каждый исполняемый бинарник что-то выводит. Если для каждого из них создавать окно с texbox (а-ля собственная консоль для вывода), то проблема остается. Из форка я с ГУИ работать не могу.

Можно создать "голую" консоль (system("xterm"); грубо говоря) для каждого процесса (бинарника), но как с ней работать тоже не очень понятно.

Есть идеи по решению? ГУИ полностью написано на QT. "Движок" на С\С++.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2012, 15:32
Ответы с готовыми решениями:

не компилируется fork: Undefined reference to fork
написал маленькую fork-бомбу #include <stdio.h> #include <stdlib.h> int main() { while(1)...

Как запустить qt gui программу, как демон, без gui, скрыв gui?
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер выполняет...

Pthread
при компиляции код работает и все выводит и выполняет алгоритм но стоит запустить с командной...

pthread QT
class Widget : public QWidget { Q_OBJECT QString fileName; public: explicit...

12
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
15.02.2012, 18:52 2
2. Может быть это можно сделать средствами Qt, но вообще обычно в линуксах делают пайп и перенаправляют вывод дочернего процесса на него.
Что ты хотел саказать в первой части я вообще не понял.
0
0 / 0 / 1
Регистрация: 15.02.2012
Сообщений: 13
15.02.2012, 19:52  [ТС] 3
Цитата Сообщение от NoMasters Посмотреть сообщение
2. Может быть это можно сделать средствами Qt, но вообще обычно в линуксах делают пайп и перенаправляют вывод дочернего процесса на него.
Что ты хотел саказать в первой части я вообще не понял.
Есть textbox в главном окне. В нем надо получить список всех запущенных процессов. Есть кнопка открывающая диалог выбора сразу нескольких файлов. Первый раз нажали - получили в textbox список всех выбранных файлов. А если требуется туда добавить еще один или удалить из списка если процесс завершен? При повторном выборе файлов (для добавления в список) ничего не происходит. Вроде append/setPlaintex и все прочие должны дописать, но ничего не происходит.

Добавлено через 26 минут
Ок с пайпами и так было понятно. Вопрос другой: как "ловить" пайпы в гуишном процессе?
0
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
15.02.2012, 20:01 4
Что такое textbox? Что-то даже в доках ничего о таком классе не знают.
0
0 / 0 / 1
Регистрация: 15.02.2012
Сообщений: 13
15.02.2012, 20:21  [ТС] 5
"Что такое textbox" - не так важно. Важнее то, что если другой процесс записал байты в канал, то ГУИ должен их получить, для этого он должен сидеть и ждать пока они не придут (в цикле, например). А если он (ГУИ-шный процесс) зависнет в цикле - то не будут обрабатываться сигналы к элементам окна, т.е. оно тоже зависнет. Так вот, как же отлавливать сообщения из канала так, чтоб графика не зависала?
0
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
15.02.2012, 20:45 6
Проще всего сделать отдельный поток, мониторящий пул каналов(или можно опрашивать его по таймеру).
0
0 / 0 / 1
Регистрация: 15.02.2012
Сообщений: 13
15.02.2012, 20:49  [ТС] 7
отдельный поток - так из него работать с ГУИ не получается)

а как делать таймер? Можно ссылочку какую или кусок кода...? И кстати, ожидание байтов из канала - все попрежнему застопорит. Допустим стали мы читать из канала по таймеру - но если в канале ничего нет - мы зависнем на функции read до тех пор, пока в канале что-нибудь не появится...
0
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
15.02.2012, 20:54 8
Мы же Qt говорим? Все там с работай с гуём из разных потоков хорошо. QTimer
0
0 / 0 / 1
Регистрация: 15.02.2012
Сообщений: 13
15.02.2012, 21:27  [ТС] 9
Да. А какие потоки нужны? pthread или qthread ? Вобщем-то я оба их попробовал, и почему-то из них сделать append в QTextEdit получается только один раз. Точнее только на одной итерации цикла, находящегося в этом самом потоке. Т.е. у нас глобально объявлен QTextEdit mt; Поток выглядит как
C++
1
2
3
4
5
6
7
8
void potok()
{
    while(1)
    {
        //здесь читаем из пайпа
        mt->append("123");
    }
}
 Комментарий модератора 
Используйте теги форматирования кода!


и вот получается так, что добавляется 123 только один раз. Причем если сделать несколько аппендов в одной итерации - то они все сделаются, а на следующей итерации - опять ничего. (Следующая итерация точно присутствует, проверено, т.е. зависания на чтении пайпа не происходит)

Добавлено через 13 минут
З.Ы.
http://qtdocs.narod.ru/4.1.0/doc/html/threads.html
"На практике невозможно использовать классы GUI в других потоках, кроме главного"

http://www.prog.org.ru/topic_10757_15.html
"С GUI нельзя работать в других потоках"
0
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
15.02.2012, 22:27 10
Просто добавь неблокирующий опрос пула пайпов по таймеру в главном потоке.
0
0 / 0 / 1
Регистрация: 15.02.2012
Сообщений: 13
19.02.2012, 21:02  [ТС] 11
Вроде разобрались и проект дособрали. Для каждого пакета создается окно с полем, в которое он печатает весь вывод. Тут проблема: после 10к записей окно крэшится. Видимо проблема буфера этого поля. Можно ли как-то увеличить его?
0
Псевдослучайный
1936 / 1137 / 96
Регистрация: 13.09.2011
Сообщений: 3,205
19.02.2012, 21:12 12
И весь этот вывод нужен? Может лучше чистить старые записи?
0
0 / 0 / 1
Регистрация: 15.02.2012
Сообщений: 13
19.02.2012, 21:24  [ТС] 13
Цитата Сообщение от NoMasters Посмотреть сообщение
И весь этот вывод нужен? Может лучше чистить старые записи?
Идея была сделать "локальную" консоль для каждого пакета. Соответственно как и в обычной консоли если есть печать текста в цикле, все должно быть отображено.
Научились вроде так же создавать стандартную консоль параллельно, и сделали бы вывод для каждого пакета туда, но не известно как обрабатывать закрытие этой консоли (нужно в принципе только для того, чтобы удалить пакет и списка запущенных процессов). Нажали крестик - консоль вернула 0. А нужно следить за 10-15 консолями одновременно. Может эту проблему проще решить?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2012, 21:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

pthread
Всем доброго времени суток. Нужна помощь. Имеется Visual Studio 2017, библиотека Pthreads. При...

pthread
почему не выводит на экран: #include <pthread.h> #include <stdio.h> int main() { ...

[ubuntu] Как запустить qt-gui программу без gui-интерфейся из консоли?
Как запустить qt-gui программу без gui-интерфейса из консоли?

Как запустить GUI приложение (например, notepad.exe) без отображения GUI?
Добрый день. Интересует есть ли такая возможность, как запустить GUI приложение (например,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.