2017-02-14 14 views
0

Предположим, мы создали несколько экземпляров из класса QThread. Мне нужно отправить сообщение от одного из объектов потока к другому объекту потока, принимая во внимание, что все объекты потока создаются из одного класса Qthread. Путем испускания сигнала все объекты потоков получат излучаемый сигнал. Но я хочу, чтобы только конкретный объект (например, объект с определенным идентификатором потока) получил сигнал. Как я могу это сделать в Qt?Как передать сигнал определенному объекту класса QThread в Qt?

спасибо.

+0

Похоже, вы наследуете от QThread, и в этом случае я предлагаю вам прочитать [эту статью] (https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use -qthreads-заместитель полного объяснения /). QThread больше похож на контроллер потока, чем на фактический поток, поэтому, если вы не хотите изменить способ управления потоками Qt, вам лучше не наследовать от QThread. – TheDarkKnight

ответ

2

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

+0

Да Я подключаю сигналы к слотам в своем классе. Мой класс наследуется от класса QThread. Мне нужно то, что когда я излучаю сигнал, я не хочу, чтобы все объекты, созданные из одного класса, получали сигнал. Я хочу передать сигнал определенному объекту не всем объектам. –

+1

@ m.taheri Вы [подключаетесь] (http://doc.qt.io/qt-4.8/qobject.html#connect) к конкретным объектам, а не к классам. Сигнал будет принимать только подключенные объекты. В противном случае это не имело бы смысла. – w1ck3dg0ph3r

+0

Да, я соединяю объекты вместе. Но мне нужно передать сигнал только определенному объекту из набора связанных объектов. –

1

Если я вас правильно понял вы, возможно, потребуется QSignalMapper:

этот класс собирает набор без параметров сигналов, и повторно излучает их целое число, строка или виджета параметров, соответствующих объекту, который послал сигнал ,

Ознакомьтесь с примером для получения дополнительной информации, если вы не любите использовать устройство отображения сигналов, вы всегда можете использовать настраиваемый фильтр в своем слоте. Таким образом, все остальные слоты (не заинтересованные в сигнале) могут просто игнорировать его. Невозможно отфильтровать сигнал с помощью emit, чтобы отправить его прямо в указанные подключенные слоты.

+0

Спасибо @xander, но поскольку мои объекты являются потоками, и каждый поток имеет свой уникальный идентификатор, я сомневаюсь, что QSignalMapper был бы полезен для моей цели. Потому что мы должны были заполнить карту перед созданием и удалением потоков. В моем приложении количество потоков не фиксировано, и потоки добавляются и удаляются динамически. Но я думаю, что ваше второе предложение было бы полезным, и это единственное, что я могу сделать. Большое спасибо. –

0

Отправитель сигнала не может определить, кто принимает сигнал, и каждый экземпляр, который подключается к такому сигналу, получает его. Это присуще шаблону наблюдателя, который реализует механизм сигнала/слота.

Я бы сделал посредник, в котором производные потоки (например, A (1, .., N)) регистрируются сами. В медиаторе вам необходимо реализовать логику, сообщение из A (i) должно перейти к A (j). Преимущество заключается в том, что экземпляры A не должны знать друг друга. Взаимодействие может быть выполнено путем публикации событий, которые являются потокобезопасными в соответствии с qt.