Название: Как испустить одиночный сигнал не соединяя 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 И зачем вам потокобезопасность, если всё в одном потоке у вас работает? |