Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > В каком треде работает слот?


Автор: hexzo 5.10.2011, 12:11
В каком треде срабатывает слот? Может ли один и тот же слот исполняться одновременно, то есть если будет два сигнала подряд связанных с одним и тем же слотом. Короче там есть подводные камни?

Автор: borisbn 5.10.2011, 12:39
Цитата(hexzo @  5.10.2011,  12:11 Найти цитируемый пост)
В каком треде срабатывает слот?

зависит от http://doc.qt.nokia.com/latest/qt.html#ConnectionType-enum
Цитата(hexzo @  5.10.2011,  12:11 Найти цитируемый пост)
Может ли один и тот же слот исполняться одновременно

может
Цитата(hexzo @  5.10.2011,  12:11 Найти цитируемый пост)
Короче там есть подводные камни?

http://doc.qt.nokia.com/latest/threads-qobject.html#signals-and-slots-across-threads


Автор: hexzo 5.10.2011, 13:20
Как понимать родство треда с объектом?
in the thread which the receiving object has affinity

Автор: bsa 5.10.2011, 15:51
hexzo, чтобы это понять, надо читать полностью, а не урывками:
Цитата
Note that for QObjects that are created before QApplication, QObject::thread() returns zero. This means that the main thread will only handle posted events for these objects; other event processing is not done at all for objects with no thread. Use the QObject::moveToThread() function to change the thread affinity for an object and its children (the object cannot be moved if it has a parent).

Автор: hexzo 5.10.2011, 16:52
Слот срабатывает сразу же в том же потоке, в котором происходит вызов emit. Но если слот находится в специальных классах типа QTcpSocket, QTimer, то он сработает при следующем тике их встроеного лупа.
Я правильно прочитал?  smile 

Автор: bsa 6.10.2011, 10:51
hexzo, подозреваю, что нет.
Если отправитель сигнала находится в том же потоке, что и приемник, то приемник принимает сигнал сразу.
Если отправитель сигнала находится в потоке отличном от потока приемника, то сигнал добавляется в очередь сигналов потока приемника. И доставляется только при обработке этой очереди. Таким образом, если в потоке приемника нет eventLoop'а, то ни один сигнал не будет доставлен.

Объект класса QThread по умолчанию находится в том потоке, в котором был вызван new QThread для него. Т.е. он находится не в новом потоке, а в старом.

Автор: hexzo 6.10.2011, 11:18
bsa 
Цитата
подозреваю, что нет.

А, помоему ты тоже самое сказал что и я.

Цитата
If the signal is emitted in the thread which the receiving object has affinity then the behavior is the same as the Direct Connection.

Если сигнал вызывается в том же треде с которым родство у получателя.
Цитата
The slot is invoked immediately, when the signal is emitted. The slot is executed in the emitter's thread, which is not necessarily the receiver's thread.

То слот срабатывает сразу в том же треде.
Цитата
non-GUI Qt classes that require the presence of an event loop (such as QTimer, QTcpSocket, and QProcess).

Некоторые негуишные классы имеют свой встроенный луп.

Если принадлежность отправителя и получателя к разным тредам разная, то
Цитата
Queued Connection The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.

слот вызывается при следующем тике лупа треда связаного отношением родства с  получателем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)