Russian Qt Forum

Qt => Общие вопросы => Тема начата: niXman от Ноябрь 30, 2009, 04:26



Название: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: niXman от Ноябрь 30, 2009, 04:26
Привет.

Как можно это сделать?
Есть сложная сеть соединений. Связи в которой создаются динамически, для единственной "вспышки". Так вот, на соединение сигналов и слотов, затрачивается много времени. Но, так как жизнь каждого соединения менее секунды, интересует, можно ли их не соединять? Возможно есть какой-то не столь ресурсоемкий способ?

Спасибо за внимание.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: spectre71 от Ноябрь 30, 2009, 10:48
Привет.

Как можно это сделать?
Есть сложная сеть соединений. Связи в которой создаются динамически, для единственной "вспышки". Так вот, на соединение сигналов и слотов, затрачивается много времени. Но, так как жизнь каждого соединения менее секунды, интересует, можно ли их не соединять? Возможно есть какой-то не столь ресурсоемкий способ?

Спасибо за внимание.

В общем случае оптимизировать не получится.
Необходимо знать ограничения задачи.
Опиши подробнее.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: Igors от Ноябрь 30, 2009, 11:43
Интересно но нужны подробности. Если "менее секунды" - то проблемы нет, слот/сигнал подходит. Если "менее миллисекунды" - тогда (возможно) это проблема


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: spectre71 от Ноябрь 30, 2009, 11:54
Интересно но нужны подробности. Если "менее секунды" - то проблемы нет, слот/сигнал подходит. Если "менее миллисекунды" - тогда (возможно) это проблема

Не совсем правильно. Говорилось о времени жизни одного соединения, но ничего о частоте соединений.
Например новое соединение будет происходить раз в миллисикунду и существовать в среднем секунду.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: lit-uriy от Ноябрь 30, 2009, 14:14
тему было бы корректнее назвать "как передать сигнал...", так как послать его можно вообще ни с чем не соединяя.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: BRE от Ноябрь 30, 2009, 14:20
тему было бы корректнее назвать "как передать сигнал...", так как послать его можно вообще ни с чем не соединяя.
На ум приходит bool QMetaObject::invokeMethod


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: niXman от Ноябрь 30, 2009, 14:27
Ребята, это не обыкновенная нейронная сеть. Соединения устанавливаются перед "вспышкой", т.е. организация. Вот на этот этап уходит много времени. Кол-во нейронов, колеблется от 128к до 1024к. Сеть отрабатывает быстрее чем время на организацию.
Отсюда и мысль, что на соединение тратиться больше ресурсов чем на работу, значит нужно искать менее ресурсоемкий подход.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: spectre71 от Ноябрь 30, 2009, 14:32
Ребята, это не обыкновенная нейронная сеть. Соединения устанавливаются перед "вспышкой", т.е. организация. Вот на этот этап уходит много времени. Кол-во нейронов, колеблется от 128к до 1024к. Сеть отрабатывает быстрее чем время на организацию.
Отсюда и мысль, что на соединение тратиться больше ресурсов чем на работу, значит нужно искать менее ресурсоемкий подход.

А зачем тебе в данной задаче использовать QT механизм сигнал/слот? В данном случае это очень плохое решение.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: niXman от Ноябрь 30, 2009, 14:38
Цитировать
На ум приходит bool QMetaObject::invokeMethod
Вот. То что нужно :)

Цитировать
А зачем тебе в данной задаче использовать QT механизм сигнал/слот?
Так я реализовал задачу. Говорю же: необыкновенная нейронная сеть.

Цитировать
В данном случае это очень плохое решение.
По чему очень плохое?


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: BRE от Ноябрь 30, 2009, 14:41
По чему очень плохое?
Потому, что нужно много времени на все коннекты.
Можно хранить указатель на объект/указатель на метод и дергать его на прямую. Можно задействовать boost, там есть и bind и function.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: niXman от Ноябрь 30, 2009, 14:44
Цитировать
Потому, что нужно много времени на все коннекты.
;D сам знаю.

Цитировать
Можно хранить указатель на объект/указатель на метод и дергать его на прямую. Можно задействовать boost, там есть и bind и function.
Не потокобезопасно! А синхронизация такого кол-ва соединений с параллельной сетью, съест еще больше ресурсов. И моего моцга :)

Вопрос решен.
Всем огромное спасибо!


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: BRE от Ноябрь 30, 2009, 14:50
Так там еще многопоточность.
Не забывай, что вызов слота в другом потоке будет происходить через очередь сообщений этого потока, т.е. дополнительные задержки + порядок вызова слотов из разных потоков определить будет не легко.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: niXman от Ноябрь 30, 2009, 14:56
Цитировать
Не забывай, что вызов слота в другом потоке будет происходить через очередь сообщений этого потока, т.е. дополнительные задержки + порядок вызова слотов из разных потоков определить будет не легко.
Среди нейронов нет ГУИ объектов. Значит и сигналов кроме мойх нет.
При том, есть флаг Qt::DirectConnection


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: BRE от Ноябрь 30, 2009, 14:58
Среди нейронов нет ГУИ объектов. Значит и сигналов кроме мойх нет.
При том, есть флаг Qt::DirectConnection
Попробуй, но могут быть (и я думаю будут) глюки.  ;)


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: niXman от Ноябрь 30, 2009, 15:03
Цитировать
Попробуй, но могут быть (и я думаю будут) глюки.
Так нет же, работает. Просто долго организовывалась.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: MoPDoBoPoT от Ноябрь 30, 2009, 16:25
При том, есть флаг Qt::DirectConnection
Не, это нельзя. QMetaObject::invokeMethod с параметром Qt::DirectConnection эквивалентен прямому вызову слота, то есть не потокобезопасно. Так что либо Qt::QueuedConnection, либо хз.
Если не прав, поправьте.


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: Igors от Ноябрь 30, 2009, 17:08
invokeMethod по скорости далеко не из Парижской Коммуны (даже сам по себе). Плюс да, можно вызывать метод объекта др. нитки но это все равно выполняется через QApplication::postEvent (даже с DirectConnection, там еще семафор накручивается)

Торопится ребятенок :)


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: niXman от Ноябрь 30, 2009, 19:32
Цитировать
Не, это нельзя. QMetaObject::invokeMethod с параметром Qt::DirectConnection эквивалентен прямому вызову слота, то есть не потокобезопасно. Так что либо Qt::QueuedConnection, либо хз.
Проверил. Все работает. И синхронизация не нарушена.

Цитировать
Торопится ребятенок
не понял..


Название: Re: Как испустить одиночный сигнал не соединяя sender-receiver ?
Отправлено: KADABRA от Ноябрь 30, 2009, 21:21
Цитировать
Можно хранить указатель на объект/указатель на метод и дергать его на прямую. Можно задействовать boost, там есть и bind и function.
Не потокобезопасно! А синхронизация такого кол-ва соединений с параллельной сетью, съест еще больше ресурсов. И моего моцга :)
При том, есть флаг Qt::DirectConnection
И зачем вам потокобезопасность, если всё в одном потоке у вас работает?