Russian Qt Forum

Qt => Общие вопросы => Тема начата: Deiv от Январь 16, 2008, 13:52



Название: Требуется комментарий информации из ассистента и exampl-у
Отправлено: Deiv от Январь 16, 2008, 13:52
Разбираюсь с примером network/torrent. Сразу встретил непонятную строчку.
Код:
QMetaObject::invokeMethod(this, "loadSettings", Qt::QueuedConnection);

1. Либо что-то накосячил с переводом.
Либо перегрелся и этот набор слов мне ничего не говорит.
Переведите на более приземленный язык ( ?прокомментируйте? ).

Qt::QueuedConnection|2|When emitted, the signal is queued until the event loop is able to deliver it to the slot.
Qt::QueuedConnection|2|Когда испускается, сигнал находится в очереди пока цикл событий не доставит его в слот
было бы совсем хорошо, узнать комментарии для всех значений Qt::ConnectionType, а то мОзги на бекрень уже.

2. Всмысле он будет висеть пока слот его не примет?
Если это так, зачем оно надо (как должно сработать)?
Типа программа будет пытаться выполнить код чтения настроек до потери пульса, и пока пытается его отработать ничем другим заниматься не будет( или будет) ? В чем смысл?

3. Зачем в примере переопределен метод? Для выставления ему специфических свойств? Похоже на костыль.


Название: Re: Требуется комментарий информации из ассистента и exampl-у
Отправлено: Tonal от Январь 16, 2008, 15:35
1) По смыслу:
DirectConnection - немедленный вызов слотов или метода(для invokeMethod).
QueuedConnection - при генерации (испускание) сигнала он ставиться в очередь сообщении главного потока, и вызов слота происходит не непосредственно, а в том цикле сообщений, который его добудет.
AutoConnection - Qt самостоятельно решает как будет вызываться слот/метод. Если объект приёмник живёт в том в том же потоке будет DirectConnection, иначе QueuedConnection.

2,3) Это "отложенное выполнение". Т.е. в данном случае, MainWindow::loadSettings() вызовется не в конце конструктора, а когда придёт его очередь, т.е. окно отобразиться на экране.
Его же можно получить ещё такис способом:
Код:
QTimer::singleShot(0, this, "loadSettings");

P.S. Если верить ассистенту, все QueuedConnection сигналы/события доставляються через поток главного окна...
Однако надо иметь это в виду - можно поиметь узкое место на обмене сигналами между потоками...


Название: Re: Требуется комментарий информации из ассистента и exampl-у
Отправлено: pastor от Январь 16, 2008, 15:45
1,2

Вобщем так. Когда используеться Qt::DirectConnection, то событие обрабатывается сразу. Когда используеться Qt::QueuedConnection, то событие ставится в общую очередь и будет обработано только после всех сообщений, уже имеющихся в этой очереди. Когда используеться Qt::AutoConnection, то если источник события находится в том же потоке, что и приёмник, то будет использован режим Qt::DirectConnection, в противном случае - Qt::QueuedConnection.

3. Это асинхронный вызов метода