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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Требуется комментарий информации из ассистента и exampl-у  (Прочитано 3301 раз)
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. Зачем в примере переопределен метод? Для выставления ему специфических свойств? Похоже на костыль.
« Последнее редактирование: Январь 16, 2008, 13:55 от Deiv » Записан
Tonal
Гость
« Ответ #1 : Январь 16, 2008, 15:35 »

1) По смыслу:
DirectConnection - немедленный вызов слотов или метода(для invokeMethod).
QueuedConnection - при генерации (испускание) сигнала он ставиться в очередь сообщении главного потока, и вызов слота происходит не непосредственно, а в том цикле сообщений, который его добудет.
AutoConnection - Qt самостоятельно решает как будет вызываться слот/метод. Если объект приёмник живёт в том в том же потоке будет DirectConnection, иначе QueuedConnection.

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

P.S. Если верить ассистенту, все QueuedConnection сигналы/события доставляються через поток главного окна...
Однако надо иметь это в виду - можно поиметь узкое место на обмене сигналами между потоками...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Январь 16, 2008, 15:45 »

1,2

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

3. Это асинхронный вызов метода
« Последнее редактирование: Январь 16, 2008, 15:47 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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