Привет.
Имеем социальную сеть и 100 аккаунтов от нее.
Стоит задача, авторизоваться на всех аккаунтах и делать от имени этих аккаунтов различные сетевые запросы в зависимости от условий и задач.
Программа что реализует данные задачи - должна быть очень шустрой.
Для реализации задачи смотрю в сторону много-поточности.
Для сетевых запросов будет использоваться
QNetworkAсcessManager (
qnam)
Так как он может работать асинхронно, для него будет создан отдельный вечно живущий поток,
который будет посылать и принимать запросы в сеть интернета.
Мы знаем, что в зависимости от флага
QRunnable::setAutoDelete() объект в
QThreadPool может быть уничтожен после выхода из функции
runлибо может там оставаться (видимо засыпать и просыпаться используя releaseThread() и reserveThread())
И вот тут у меня возникло 3 впороса.1 ВОПРОС.Допустим поступила задача = АВТОРИЗОВАТЬСЯ на сайте
выполнение данной задачи состоит из трех операций
1) Зайти на сайта и получить куки
2) Отправит логин и пароль
3) Получить от сайта hash данные об успешной авторизиции
Как лучше поступить? как организовать выполнение операций при взаимодействии с
qnam ?
Создать объект с логикой авторизации, засунуть его в
QThreadPool на выполнение первой операции.
Оттуда объект посылает сигнал в
qnam с запросом и засыпает там в
QThreadPool или удаляется оттуда что бы не мешать другим потокам?
или может он там засыпает и не мешает другим потокам благодаря использованию releaseThread()
Но вот
qnam получил ответ на первую операцию, получается если объект по прежнему жив в
QThreadPool то он должен проснуться и получить данные, а если мы приняли решение не хранить в
QThreadPool объекты после их выполнения, то следует снова создать объект для выполнения уже второй операции и передать его в
QThreadPool Видимо я даже толком не могу сформировать первый вопрос,... если быть проще, то вопрос в том, как лучше организовать это хозяйство. Ибо данные мало просто отослать, их нужно еще обработать и выслать новый запрос на основе полученных данных.
2 ВОПРОС.В документации к
QThreadPool сказано, если я установлю QRunnable::setAutoDelete(
true);
То собственником объекта станет
QThreadPool, и объект будет удален тогда, когда последний поток в QThreadPool завершит свою работу.
Получается если я накидаю в QThreadPool около 1000 QRunnable объектов с флагом QRunnable::setAutoDelete(true); то эти объекты будут там находится до тех пор, пока есть хоть один работающий поток? получается на протяжении работы всей программы, если в QThreadPool всегда есть работающий поток, объекты будут собираться как мусор получается?
Или я не так что то понял?
3 ВОПРОС.Если я буду отсылать в
QThreadPool объекты с флагом QRunnable::setAutoDelete(
false);
То я смогу вызывать выполнение данного объекта повторно вызывая одну из функций:
C++ (Qt)
myObject; // Inherit QRunable
QThreadPool::globalInstance()->start(myObject); // First
...
...
...
QThreadPool::globalInstance()->start(myObject); // Second
либо так еще можно
C++ (Qt)
QRunnable::tryStart(this);
Объясните мне, что такое QRunnable::tryStart(this);
Получается объект прибывая в стеке потоков QThreadPool
пытается запустить выполнение самого себя в новом потоке? при этом поток инициировавший данный вызов продолжит свое выполнение?