Название: Требуется комментарий информации из ассистента и exampl-у Отправлено: Deiv от Январь 16, 2008, 13:52 Разбираюсь с примером network/torrent. Сразу встретил непонятную строчку.
Код: QMetaObject::invokeMethod(this, "loadSettings", Qt::QueuedConnection); 1. Либо что-то накосячил с переводом. Либо перегрелся и этот набор слов мне ничего не говорит. Переведите на более приземленный язык ( ?прокомментируйте? ).
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. Это асинхронный вызов метода |