Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Qt: передача сообщения в поток GUI  [new]
petrav
Member

Откуда:
Сообщений: 2861
Какие у нас есть варианты?

- Система слот/сигнал в таком варианте работает потокобезопасно и асинхронно.
- QApplication::postEvent().

Ещё варианты есть?
23 дек 20, 18:25    [22252966]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
White Owl
Member

Откуда:
Сообщений: 12682
petrav
Ещё варианты есть?
А зачем еще? сигналы это самое правильное и удобное.
И кстати, система сигналов сама использует postEvent() внутри. А оно использует QQueue... Так что можешь еще вручную с очередями играться.

Но если сильно хочется... Тогда отходи от Qt стандартов и делай ну например разделяемую память. Или очереди-сигналы на основе pthereads.
23 дек 20, 19:19    [22253001]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,

Обсуждали жеж
22196831
23 дек 20, 19:22    [22253002]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
petrav
Member

Откуда:
Сообщений: 2861
White Owl
petrav
Ещё варианты есть?
А зачем еще? сигналы это самое правильное и удобное.
И кстати, система сигналов сама использует postEvent() внутри. А оно использует QQueue... Так что можешь еще вручную с очередями играться.

Я ради интереса спросил. Да и обсудить.

В данном случае мне не нравятся слоты/сигналы, потому что придётся активировать кодогенератор (Q_OBJECT) там где он не нужен. Я, пожалуй, напишу вокруг postEvent() простую обёртку принимающую функтор (std::function + std::bind). Что бы одним движением вызывать методы классов из потока GUI. Я подумал может там (в Qt) что-то готовое в таком духе есть.

White Owl
Но если сильно хочется... Тогда отходи от Qt стандартов и делай ну например разделяемую память. Или очереди-сигналы на основе pthereads.

Да чёта... Ну. С трудом себе представляю как это интегрировать с очередью событий в Qt. Наверное, это излишне.
23 дек 20, 20:48    [22253050]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
petrav
Member

Откуда:
Сообщений: 2861
Там выше небольшая ошибка, правка: Что бы одним движением вызывать методы классов в потоке GUI.

Вот тоже интересно, если поток создан с помощью std::thread, а мы из него вызовем сигнал, а слот подключён к объекту Qt принадлежащему потоку GUI? Т.е. вот корректно ли ожидать рабочего симбиоза от разных... инструментов многопоточности (QThread, std::thread)?
23 дек 20, 21:06    [22253057]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
White Owl
Member

Откуда:
Сообщений: 12682
petrav

Вот тоже интересно, если поток создан с помощью std::thread, а мы из него вызовем сигнал, а слот подключён к объекту Qt принадлежащему потоку GUI? Т.е. вот корректно ли ожидать рабочего симбиоза от разных... инструментов многопоточности (QThread, std::thread)?
Конечно нет. Проблемы в этом случае гарантированы.
Хочешь устойчивой работы в Qt - забудь про std. Не нужно оно. Вообще. Все что предоставляет std - уже есть в Qt.

Вообще, рекомендую забыть что Qt это С++. Qt это отдельный язык основанный на C++, но это не С++.
24 дек 20, 01:39    [22253138]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
>Я, пожалуй, напишу вокруг postEvent() простую обёртку принимающую функтор (std::function + std::bind
= для себя пиши. Для работодателя и других прогеров нет. Тебя никто не поймет.
Прикладник должен любить пользоваться публичными либами, платформами и концепциями. В данном случае Qt.
24 дек 20, 07:47    [22253156]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,

>Что бы одним движением вызывать методы классов в потоке GUI.
= на самом деле, в приложении не нужно делать кучу мест на потоках, из котрых нужно "одним движением".
Большинство задачек можно успеть вычислить на ButtonsClick().
Если нет, то что то с архитектурой. Или подготовленными промежуточными вычислениями.
24 дек 20, 07:53    [22253157]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
petrav
Member

Откуда:
Сообщений: 2861
White Owl
Все что предоставляет std - уже есть в Qt.

Аналог timeSetEvent() есть?
24 дек 20, 11:55    [22253265]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
Смотрите шире.
Каждый класс наследник QObject уже имеет таймер. Встроенный
+ QTimerEvent будет достаточно для ваших задач.
24 дек 20, 12:16    [22253277]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Про потоки из справки:
В многопоточных приложениях вы можете использовать QTimer в любом потоке, имеющем цикл событий. Чтобы запустить цикл обработки событий из потока без графического интерфейса, используйте QThread :: exec (). Qt использует привязку потока таймера, чтобы определить, какой поток испускает сигнал timeout () . Из-за этого вы должны запускать и останавливать таймер в его потоке; невозможно запустить таймер из другого потока.
24 дек 20, 12:23    [22253282]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
petrav
Member

Откуда:
Сообщений: 2861
PetroNotC Sharp
petrav,
Смотрите шире.
Каждый класс наследник QObject уже имеет таймер. Встроенный
+ QTimerEvent будет достаточно для ваших задач.

Кстати да, про поток с очередью событий я не подумал. Вопрос, конечно, в точности такого таймера.

Но в любом случае, концепция о полной несовместимости Qt, C++ и WinAPI мне кажется странной. Такое положение вещей означало бы смерть и std, и Qt.
24 дек 20, 12:58    [22253301]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
- сам Qt для ГУИ где точность не особо нужна.
- они не то что несовместимы. Это закон такой - если платформа, то пляши по неё. Она диктует архитектуру. Разрабы ЗА ТЕБЯ все продумали.
Это в люом ЯП так.
В шарпе при винформ писать надо было так, а при Core по другому.
И т.д.
24 дек 20, 13:13    [22253317]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
Насчет очереди события я вижу так:
Либо мы стартуем без таймера 10 потоков и они делают работу. По окончании сигнализируют.
Либо с таймером стартуем обновление ГУИ, но таймер сам вызовет событие в основном потоке ГУИ. Причем тогда потоки?
24 дек 20, 13:18    [22253324]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
Но в любом случае, концепция о полной несовместимости Qt, C++ и WinAPI мне кажется
странной. Такое положение вещей означало бы смерть и std, и Qt.

А что в ней странного? Qt писалась под Линух, поэтому с WinAPI оно несовместимо по
определению. std делалось как кроссплатформенное, соответственно несовместимо с двумя
остальными.

Posted via ActualForum NNTP Server 1.5

24 дек 20, 13:36    [22253339]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
petrav
Member

Откуда:
Сообщений: 2861
PetroNotC Sharp
petrav,
Насчет очереди события я вижу так:
Либо мы стартуем без таймера 10 потоков и они делают работу. По окончании сигнализируют.
Либо с таймером стартуем обновление ГУИ, но таймер сам вызовет событие в основном потоке ГУИ. Причем тогда потоки?

Поток timeSetEvent() обслуживает работу с оборудованием, неограниченное время работы. И желательно в мягком реалтайме. Но поток таймера timeSetEvent() должен влиять и на GUI. Я для этого использую postEvent().
24 дек 20, 13:58    [22253351]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,

>Поток timeSetEvent() обслуживает работу с оборудованием,
=эту фразу можно заменить более привычными понятиями:
"требуется постоянно опрашивать бд на предмет новой инфы".
Сколько длится цикл опроса?
24 дек 20, 14:25    [22253374]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
Поток timeSetEvent() обслуживает работу с оборудованием, неограниченное время работы. И
желательно в мягком реалтайме.

И зачем тогда в нём таймер? Там должен быть QNanoSleep, QWaitFor или что-то в этом роде.

Posted via ActualForum NNTP Server 1.5

24 дек 20, 14:28    [22253376]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

petrav
Но в любом случае, концепция о полной несовместимости Qt, C++ и WinAPI мне кажется
странной. Такое положение вещей означало бы смерть и std, и Qt.

А что в ней странного? Qt писалась под Линух, поэтому с WinAPI оно несовместимо по
определению. std делалось как кроссплатформенное, соответственно несовместимо с двумя
остальными.

Странен сам предполагаемый подход. Представьте себе, что QMutex, вызванный из WinAPI потока, каким-то образом пытается получить указатель на объект QThread связанный с этим потоком. И не найдя этот объект потока начинаются крайне сложно воспроизводимые глюки. Это было бы больше похоже на вредительство внутри команды разработчиков Qt.

Сообщение было отредактировано: 24 дек 20, 18:43
24 дек 20, 18:45    [22253612]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
Какой то выдуманный пример. Не надо мьютекс использовать.
24 дек 20, 19:43    [22253643]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
Barlone
Member

Откуда:
Сообщений: 1452
Dimitry Sibiryakov

petrav
Но в любом случае, концепция о полной несовместимости Qt, C++ и WinAPI мне кажется
странной. Такое положение вещей означало бы смерть и std, и Qt.

А что в ней странного? Qt писалась под Линух, поэтому с WinAPI оно несовместимо по
определению. std делалось как кроссплатформенное, соответственно несовместимо с двумя
остальными.
Да ну. Что конкретно в Qt несовместимо с std? Вот например https://doc.qt.io/qt-5/containers.html#stl-style-iterators
qHash() для std::pair есть. В QVector есть методы fromStdVector, toStdVector. В QMap - toStdMap. Для QString тоже есть toStdString.
А, вот еще
https://doc.qt.io/qt-5/qtalgorithms.html
Historically, Qt used to provide functions which were direct equivalents of many STL algorithmic functions. Starting with Qt 5.0, you are instead encouraged to use directly the implementations available in the STL; most of the Qt ones have been deprecated (although they are still available to keep the old code compiling).


Сообщение было отредактировано: 24 дек 20, 21:31
24 дек 20, 21:33    [22253689]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
Barlone
Member

Откуда:
Сообщений: 1452
Насчет "Qt писалось под linux, и с WinAPI несовместимо" тоже сомнительно. У того же QThread есть например метод setPriority, который работает под windows, а под линуксом ничего не делает
The effect of the priority parameter is dependent on the operating system's scheduling policy. In particular, the priority will be ignored on systems that do not support thread priorities (such as on Linux, see http://linux.die.net/man/2/sched_setscheduler for more details).


Сообщение было отредактировано: 24 дек 20, 21:43
24 дек 20, 21:48    [22253691]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Barlone
У того же QThread есть например метод setPriority, который работает под windows, а под
линуксом ничего не делает

А теперь самое главное по ссылке: "This function was introduced in Qt 4.1.", что чертовски
далеко от "писалось".

Posted via ActualForum NNTP Server 1.5

24 дек 20, 22:25    [22253697]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
petrav
Member

Откуда:
Сообщений: 2861
Barlone
Dimitry Sibiryakov

пропущено...

А что в ней странного? Qt писалась под Линух, поэтому с WinAPI оно несовместимо по
определению. std делалось как кроссплатформенное, соответственно несовместимо с двумя
остальными.
Да ну. Что конкретно в Qt несовместимо с std? Вот например https://doc.qt.io/qt-5/containers.html#stl-style-iterators
qHash() для std::pair есть. В QVector есть методы fromStdVector, toStdVector. В QMap - toStdMap. Для QString тоже есть toStdString.

Они имеют ввиду "я конечно не экономист, но точно чувствую гнилое здесь дело, лажа какая то зарыта" — как в экранизации Пелевина. В том плане, что в сложных вопросах межпоточного взаимодействия там действительно могут быть проблемы. Хотя допустить такое... ну это нужно как-то осмысленно навредить.

Но вот если вспомнить функцию _beginthread(). Дело в том, что ::CreateThread() ничего не знает про CRT и потоки созданные с помощью ::CreateThread() не совсем корректно потом работают с Си-рантаймом. Но тут я что-то подзабыл.
24 дек 20, 23:16    [22253701]     Ответить | Цитировать Сообщить модератору
 Re: Qt: передача сообщения в поток GUI  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Несколько мыслей.

1) Большинство современных UI - по сути однопоточные. Были попытки построить реально
мультипоточный UI у Apple (iPhone). Не знаю насколько успешные. Пускай знающие расскажут.
2) Все кросс-платформенные UI фреймворки обычно терпят неудачу при глубоком использовании.
Тоесть либо ты не можешь использовать какую-то фичу просто потому что она в Gnome/KDE
отсуствует а есть в Windows. Либо для использования фичи ты все равно вынужден ходить
в API ОС в обход UI фреймворка.
3) Приходится проект разделять на под-проекты-платформеры Linux/Win/Mac и писать реализации
раздельно при некой общей разделяемой части логики.
4) Даже под одну ОС UI может иметь несколько независимых способов программинга (WinGDI, OpenGL, DirectX)
и это еще сильнее путает разработчика.
25 дек 20, 01:01    [22253716]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / C++ Ответить