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 точки зрения запуска заданий отсуствует.. Заранее спасибо! |
|
|
SABROG |
18.2.2009, 15:45
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Так у меня и получается что на асинхронный сигнал QFtp надо вызывать слот в этом же потоке.. (например как я уже говорил для анализа и работы листинга директории) Соединяй нужные сигналы от QFtp со слотами QThread и выполняй exec() в run(). Все, что будет одти до exec - выполняется один раз при запуске потока, потом exec() входит в "бесконечный" цикл, т.е. возврата из run() не будет до тех пор, пока не будет выход из eventloop, а это произойдет уже при завершении потока. Таким образом все слоты будут обрабатываться не до и не после exec, а во время. QFtp::list() и прочие команды возвращают свой уникальный ID команды. Можно использовать этот номер, чтобы отслеживать, когда команда завершится. До завершения команды у тебя будут приходить сигналы listInfo(), можно его обрабатывать и заполнять свой список нужным образом, отсортировывая не нужное. В конце придет сигнал commandFinished(int id), IDшник сравниваешь с IDшником возвращенным от list()'a и если это он, то начинаем выкачивать файлы по одному из своего списка. Удаляя выкаченные файлы из списка. На завершение выкаченных файлов тоже будут приходить сигналы со своим id, там ты и будешь удалять из своего списка то, что скачалось. Когда список станет нулевым можно закрыть соединение QFtp::close(), удалить экземпляр QFtp::deleateLater() и завершить поток, т.е. сделать тот самый выход из exec() - quit()/exit(0). Сообщение отредактировал SABROG - 18.2.2009, 16:14 |
|
|
Гость_me_* |
18.2.2009, 16:35
Сообщение
#3
|
Гости |
Таким образом все слоты будут обрабатываться не до и не после exec, а во время. Тоесть начиная с того как был вызван непосредственно exec и мы вошли в event loop и до тех пока не вызовем завершить поток, т.е. сделать тот самый выход из exec() - quit()/exit(0) Большое спасибо!!! По этому поводу все вопросы в сущности и были) |
|
|
Текстовая версия | Сейчас: 29.11.2024, 22:04 |