Exec threads etc... |
Здравствуйте, гость ( Вход | Регистрация )
Exec threads etc... |
Гость_me_* |
17.2.2009, 23:03
Сообщение
#1
|
Гости |
Доброго времени суток..
Не так давно начал разбираться с взаимодействием потоков в qt и осознал что оч мощно запутался. Есть задача: написать многопотоный ftp клиент который парсит файлик с заданиями и закачивает с разных ftp ресурсов файлы. Многопоточный просто для того чтобы самому в этом хорошенько разобраться. Решил организовать это следующим образом на каждое задание создаётся поток и далее вся работа через QFtp. Насколько я понял QFtp асинхронный, а так как мне требуется помимо непосредственно работы с ftp в этом же потоке обрабатывать некоторые действия со скачанными файлами то требуется вынести это в соотвествующие слоты. Не понятно мне стало вот что: - насколько я понимаю слоты прикреплённые к соотвествующим сигналам из Qftp НЕ будет выполнятся до тех пор пока не будет вызван exec в потоке? Но тогда я так понима.ю мне придётся как минимум обращаться к потоку из главного потока дважды. Первый раз на старт потока а второй на запуск задания (просто слот с перечнем комманд на коннект и на скачку) - получается что всю работу с ftp надо будет полностью выносить в отдельные слоты, что видится мне несколько грамоздким. Вообщем требуется квалифицированная помощь))) з.ы. Заранее хочу сказать, что листал книги по qt, читал документацию, но разобрался не во всём и эти моменты для меня туманны, так что просьба к великому гуглу не отсылать))) з.з.ы Какой-нибудь простенький пример будет оч кстати.. ток главный смысл в том что программа будет автоматизированна и без участие человека и без гуи... так что явный инициатор QFtp c точки зрения запуска заданий отсуствует.. Заранее спасибо! |
|
|
ViGOur |
17.2.2009, 23:36
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Работу с FTP не нужно выносить в отдельные слоты.
Давай попробуем разделить изучение того, что тебе нужно на шаги: 1. Для лучшего понимания почитай Сигналы и слоты () (если еще не читал) 2. Глянь пример работы с ftp: FTP Example. А за одно и класс QFtp, для получения файла нужно использовать: int QFtp::get ( const QString & file, QIODevice * dev = 0, TransferType type = Binary ). По данному примеру и сделай свою реализацию, пускай и консольную, GUI в примере чисто для визуализации. 3. Прочитай Поддержка потоков в Qt. А теперь, если ты на отлично понял 1, 2, 3 пункты, попробуй 'нарисовать' более ясную картину твоей реализации. Потому как у тебя явно полная каша в голове. |
|
|
Гость_me_* |
18.2.2009, 0:17
Сообщение
#3
|
Гости |
А теперь, если ты на отлично понял 1, 2, 3 пункты, попробуй 'нарисовать' более ясную картину твоей реализации. Потому как у тебя явно полная каша в голове. Вы не поверите.. про потоки и слоты я читал.. и пример тоже смотрел. Причём после предложения прочитать ещё раз я честно перечитал это ещё раз дабы освежить в памяти. В голове у меня действительно сейчас небольшая каша..((( причём гланым образом из-за того что я не понимаю как конкретно работает асинхронный QFtp. Ведь как я понял функции аля connect и get сразу же возвращают значение при этом не блокируют поток... Вообще самое печальное что я не так давно делал и клиентское приложение и серверное приложение где было по потоку на соединение.. но там вроде всё получилось но видать не доразобрался до конца. Попробую объяснить что я хотел бы сделать: Главный поток парсит файл. На каждое задание он создаёт поток и передаёт конструктору потока адрес сервера, логин пароль, путь к папке на сервере, путь к локальной папке. В потоке происходит подключение к ftp серверу. Считывается листинг директории (с вхождением в глубь) и проверяется по маске нужные нам файлы. После этого файлы скачиваются. Неясный мне момент вот в чём: void MyThread::run() { QFtp ftp = new QFtp; ftp->connectToHost("ftp.trolltech.com"); ftp->login(); ftp->list(); ...... ftp->close(); exec(); } 1) list будет испускать сигнал о каждой записи. Предположим что мы сделали коннект этого сигнала со слотом класса MyThread который их как-то обрабатывает. Скажите сигнал listInfo будет обрабатываться после exec или до??? или exec вообще здесь никак не влияет? Если бы речь шла о функциях которые отрабатывают сразу всё было бы ясно.. но здесь ведь асинхронная работа.. Или exec нам в данном случае вообще не нужен? 2) получается что если там где стоит .... я бы захотел как-то обрабатывать файлы которые скачал (будем считать что после list идёт скачка файлов) то тогда мне надо выносить это в слот, потому что скачивание файлов тоже асинхронно и мы можем перейти к выполнению этих операций тогда когда файлы ещё по существую не скачались. 3) добавлю к вопросу 1. Когда мы будем извещаться о том отработала например функция connectToHost (cоотвествующий сигнал что функция done)? в произвольный момент времени после её вызова или строго после exec? з.ы. exec как много в этом звуке=(((( |
|
|
SABROG |
18.2.2009, 0:37
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Скажите сигнал listInfo будет обрабатываться после exec или до??? Во время, скорее всего. Я так понял класс хоть и ассинхронный, но он не поточный, а событийный (event loop). Если ты застрянешь в каком-нибудь методе надолго и возвращение не будет в eventloop, то и слоты твои вызываться не будут. Сообщение отредактировал SABROG - 18.2.2009, 0:46 |
|
|
Гость_me_* |
18.2.2009, 1:01
Сообщение
#5
|
Гости |
Скажите сигнал listInfo будет обрабатываться после exec или до??? Во время, скорее всего. Я так понял класс хоть и ассинхронный, но он не поточный, а событийный (event loop). Если ты застрянешь в каком-нибудь методе надолго и возвращение не будет в eventloop, то и слоты твои вызываться не будут. Эмм... не понял. Что такое поточный класс? "Если ты застрянешь в каком-нибудь методе надолго и возвращение не будет в eventloop, то и слоты твои вызываться не будут." - тоже не понял что вы имели ввиду( |
|
|
SABROG |
18.2.2009, 1:39
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
|
|
|
Гость_me_* |
18.2.2009, 9:16
Сообщение
#7
|
Гости |
|
|
|
SABROG |
18.2.2009, 9:38
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Это из-за того, что QAbstrackSocket не блокирующий. Не знаю как в linux'е, а в виндах асинхронность добивается путем принятия WM_сообщений окном от ОС. Естественно, если в этот момент выполняется какой-нибудь метод, то сама программа не получит сообщение о том, что пришли какие-то данные, пока не произойдет возврат в основной event loop, где Qt сможет забрать сообщения от ОС с помощью API.
Вообще, если сравнивать гуишный и консольный вариант программ Qt, то консольные программы тоже бывают разные. Тот вариант консольного приложения, что делает Qt не будет работать в DOS'e например. Это обычное Win32 console приложение, где главным окном является окно консоли и оно естественно поддерживает windows messages. В *nix'ах это уже другое приложение, оно будет работать без X-Server'а, там механизм событий уже иной. Сообщение отредактировал SABROG - 18.2.2009, 10:19 |
|
|
Гость_me_* |
18.2.2009, 9:51
Сообщение
#9
|
Гости |
Это из-за того, что QAbstrackSocket не блокирующий. Не знаю как в linux'е, а в виндах асинхронность добивается путем принятия WM_сообщений окном от ОС. Естественно, если в этот момент выполняется какой-нибудь метод, то сама программа не получит сообщение о том, что пришли какие-то данные, пока не произойдет возврат в основной event loop, где Qt сможет забрать сообщения от ОС с помощью API. Вроде всё стало понятно, спасибо! Эх.. а с блокирующими сокетами было бы всё несколько проще.. |
|
|
Константин |
18.2.2009, 14:46
Сообщение
#10
|
Студент Группа: Участник Сообщений: 69 Регистрация: 9.2.2009 Пользователь №: 539 Спасибо сказали: 15 раз(а) Репутация: 1 |
Гость_me_*,
для испускания сигналов петля событий не нужна. т.е. вообще. петля событий потоку необходима, если в этом потоке требуется асинхронно выполнять слоты. твоя задача решается довольно просто, если разобраться со взаимодействием потоков в кутэ. /* хотел привести ссылку на почитать, но не нашёл ( */ |
|
|
Текстовая версия | Сейчас: 26.11.2024, 11:48 |