Russian Qt Forum
Май 03, 2024, 02:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Сигналы и массив  (Прочитано 32651 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Декабрь 01, 2009, 17:56 »

Вопрос ко всем знающим - можно ли сигналы "загнать" в массив, именно какой-либо qt-массив (или коллекцию и т.п.) не средствами с++ (ну можно и с++, я уже прикину аналог на java если возможно будет). Вобщем куда-нибудь, но чтобы потом из другого класса можно было указать слот на каждый из этих элементов-сигналов массива. Собсна закидывать в массив уже могу:
Код:
ArrayList signals = new ArrayList();
signals.add(0, new Signal1<Integer>());
Но emit() нужно вызвать без переменной посредника (т.е. не применяя например
Код:
Signal<Integer> x = signals.get(0); 
x.emit(111))
Проще говоря, мне нужно осуществить что-то наподобие signals.get(0).emit(111);
Записан

kubuntu/Win7/x64/NetBeans
spectre71
Гость
« Ответ #1 : Декабрь 01, 2009, 18:36 »

Вопрос ко всем знающим - можно ли сигналы "загнать" в массив, именно какой-либо qt-массив (или коллекцию и т.п.) не средствами с++ (ну можно и с++, я уже прикину аналог на java если возможно будет). Вобщем куда-нибудь, но чтобы потом из другого класса можно было указать слот на каждый из этих элементов-сигналов массива. Собсна закидывать в массив уже могу:
Код:
ArrayList signals = new ArrayList();
signals.add(0, new Signal1<Integer>());
Но emit() нужно вызвать без переменной посредника (т.е. не применяя например
Код:
Signal<Integer> x = signals.get(0); 
x.emit(111))
Проще говоря, мне нужно осуществить что-то наподобие signals.get(0).emit(111);

Не вижу смысла в таком массиве.  Советую изменить архитектуру.
Опиши задачу, для чего тебе потребовался такой массив.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Декабрь 01, 2009, 18:38 »

почему-то мне это напомнило QSignalMaper
Записан

Юра.
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #3 : Декабрь 01, 2009, 18:48 »

Есть основной поток и множество других. Каждый из "других" имеет свой сигнал, основной поток имеет слот, на который все сигналы второстепенных потоков будут ссылаться. Это первая часть. Другая состоит в том, что основной поток должен будет испускать сигналы так, чтобы только нужные потоки его получали.
С массивом это было бы просто - главный поток делал бы connect() только с теми сигналами, которые нужны (чтобы слоты не срабатывали по прогрессии, накопления). Ну и наоборот.

п.с. на самом деле немного упростил, у меня 3 уровня потоков: основной, второй (единственный) поток, который создаёт потоки 3го уровня, и собственно куча потоков 3го уровня которые будут слать сигналы через через 2й аж на 1й, но не в том суть.
« Последнее редактирование: Декабрь 01, 2009, 18:56 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Декабрь 01, 2009, 18:55 »

почему-то мне это напомнило QSignalMaper
Много думал о вариантах и с ним тоже. Типа создам мапер в классе, который создаёт потоки 3го уровня, чтобы эти потоки в него пихать. Создам слот мапера, который будет принимать, например, номер созданного потока при каждом их испускании сигнала, а что потом делать с этим номером? С массивом сигналов было бы и проще и удобнее как-то.
Записан

kubuntu/Win7/x64/NetBeans
spectre71
Гость
« Ответ #5 : Декабрь 01, 2009, 18:56 »

Есть основной поток и множество других. Каждый из "других" имеет свой сигнал, основной поток имеет слот, на который все сигналы второстепенных потоков будут ссылаться. Это первая часть.

Для этого можно использовать QSignalMaper - если требуется идентификация того кто послал сигнал.

Другая состоит в том, что основной поток должен будет испускать сигналы так, чтобы только нужные потоки его получали.
С массивом это было бы просто - главный поток делал бы connect() только с теми сигналами, которые нужны (чтобы слоты не срабатывали по прогрессии, накопления). Ну и наоборот.

Опиши чуть подробнее, есть предположение что ты имеешь ввиду, но не совсем уверен.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 01, 2009, 19:01 »

Сигналы между нитками все равно сводятся к postEvent - так почему бы, не мудрствуя лукаво, его и не задействовать? Получатели известны, все что надо передать - поместить в потомок QEvent и.т.д
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Декабрь 01, 2009, 19:11 »

Опиши чуть подробнее, есть предположение что ты имеешь ввиду, но не совсем уверен.
Не знаю как бы ещё по-подробнее...Просто не хочу приводить ява-код, только лишний раз вводить в заблуждение.
Жму на форме "старт", запускается поток, который клепает множество других (в цикле), которые испускают сигналы. Зачем это дело кинул в отдельный поток? - чтобы легко было управлять, ставить паузы, запускать заново с обнулением счётчика, не тормозила форма при этом цикле и т.п.
Главный поток (который отвечает за gui) принимает сигналы и создаёт gui-объекты, после создания каждого объекта шлёт такой сигнал, чтобы именно нужный поток 3го уровня его подхватил. Затем поток 3 уровня может послать на главный поток другой сигнал (если надо), главный поток ему (и только ему) ответит результатом.
Записан

kubuntu/Win7/x64/NetBeans
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Декабрь 01, 2009, 19:11 »

>>Другая состоит в том, что основной поток должен будет испускать сигналы так,
>>чтобы только нужные потоки его получали.
Ты не говорил, что у основного потока есть сигналы, говорил, что один слот. И не говорил, что у потоков есть слоты.
Но даже если это так, то не вижу никакой причины просто сединить их в основном птоке
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Декабрь 01, 2009, 19:16 »

Жму на форме "старт", запускается поток, который клепает множество других (в цикле), которые испускают сигналы.
в цикле же и делаешь соединение
Главный поток (который отвечает за gui) принимает сигналы и создаёт gui-объекты, после создания каждого объекта шлёт такой сигнал, чтобы именно нужный поток 3го уровня его подхватил.
Объект отправитель (из потока) знаешь (через sender()) вызываешь его метод с помощью invokeMethod()
Затем поток 3 уровня может послать на главный поток другой сигнал (если надо), главный поток ему (и только ему) ответит результатом.
аналогично выше перечисленному
Записан

Юра.
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #10 : Декабрь 01, 2009, 19:17 »

>>Другая состоит в том, что основной поток должен будет испускать сигналы так,
>>чтобы только нужные потоки его получали.
Ты не говорил, что у основного потока есть сигналы, говорил, что один слот. И не говорил, что у потоков есть слоты.
Но даже если это так, то не вижу никакой причины просто сединить их в основном птоке

Каждый раз, когда поток основной формы будет слать сигнал, то все ранее связанные с ним connect()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока...
« Последнее редактирование: Декабрь 01, 2009, 19:19 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #11 : Декабрь 01, 2009, 19:18 »

Главный поток (который отвечает за gui) принимает сигналы и создаёт gui-объекты, после создания каждого объекта шлёт такой сигнал, чтобы именно нужный поток 3го уровня его подхватил.
Объект отправитель (из потока) знаешь (через sender()) вызываешь его метод с помощью invokeMethod()
Затем поток 3 уровня может послать на главный поток другой сигнал (если надо), главный поток ему (и только ему) ответит результатом.
аналогично выше перечисленному
этого я не знал, спасибо, попробую
« Последнее редактирование: Декабрь 01, 2009, 19:23 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Декабрь 01, 2009, 19:25 »

Каждый раз, когда поток основной формы будет слать сигнал, то все ранее связанные с ним connect()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока...
про это я не понял, расскажи как ты представляешь соединение (напримере не массы потоков а одного дополнительного)
Записан

Юра.
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #13 : Декабрь 01, 2009, 19:37 »

Каждый раз, когда поток основной формы будет слать сигнал, то все ранее связанные с ним connect()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока...
про это я не понял, расскажи как ты представляешь соединение (напримере не массы потоков а одного дополнительного)
Я себе его пока (без массива сигналов) не представлю, иначе бы не запостил тему.
Если бы можно было сигналы пихать в массив, то:
при старте цикла в потоке, создающего потоки - создался поток Улыбающийся(в который я передам i цикла и класс главного потока). Тут же, при этой же итерации присваиваю массиву mas сигнал (ну можно и в самом только что созданном потоке), делаю connect() главной формы с новоприсвоенным элементом mas. Делаю в созданном потоке коннект с главным потоком (для получения результата) и испускаю сигнал для создания главным потоком gui-объекта.
« Последнее редактирование: Декабрь 01, 2009, 19:44 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #14 : Декабрь 01, 2009, 19:39 »

Каждый раз, когда поток основной формы будет слать сигнал, то все ранее связанные с ним connect()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока...
про это я не понял
Если я в главной форме объявлю единственный сигнал signal, а потом в каждом из потоков буду с ним соединять, то при каждом emit() этого главного потока, все предыдущие соединения будут также реагировать
« Последнее редактирование: Декабрь 01, 2009, 19:49 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.059 секунд. Запросов: 22.