Needing a working example on how to use QThreadPool
12,712
I would recommend you to take a look to
http://wiki.qt.io/Threads_Events_QObjects
Pay attention to QObjects ownership between threads.
Author by
mgh
Updated on June 14, 2022Comments
-
mgh almost 2 years
I want to use multiThreading webkit with
QThreadPool
My code is:
webkitrunnable.cpp:
webkitRunnable::webkitRunnable(QUrl inputURL) : url(inputURL) { init(); } void webkitRunnable::run() { qDebug() << "run ..."; qDebug() << "webkit runnable --> " << url; loadPage(url); } void webkitRunnable::init() { qDebug() << "WebKit--> init webkit"; webView = new QWebView; connect(webView, SIGNAL(loadFinished(bool)), SLOT(finishLoading(bool))); manager = new QNetworkAccessManager(this); manager = webView->page()->networkAccessManager(); webView->page()->setNetworkAccessManager(manager); connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*))); } void webkitRunnable::finishLoading(bool) { qDebug() << "WebKit--> finish loading"; } void webkitRunnable::replyFinished(QNetworkReply* Reply) { qDebug() << "WebKit--> reply Finished"; } void webkitRunnable::loadPage(QUrl url) { qDebug() << "WebKit--> load Page"; webView->load(url); webView->setFocus(); }
webkitrunnable.h:
class webkitRunnable : public QObject, public QRunnable { Q_OBJECT public: webkitRunnable(QUrl inputURL); void loadPage(QUrl url); protected: void run(); signals: public slots: void finishLoading(bool); void replyFinished(QNetworkReply*); private: void init(); QUrl url; QNetworkAccessManager *manager; QWebView *webView; };
mythread.cpp:
MyThread::MyThread(QObject *parent) : QObject(parent) { threadPool = new QThreadPool(this); threadPool->setMaxThreadCount(20); webkit = new webkitRunnable(QUrl("http://www.google.com/")); } MyThread::~MyThread() { delete threadPool; } void MyThread::startMultiThreadLoad(QUrl url) { webkit = new webkitRunnable(url); connect(webkit, SIGNAL(threadFinished(int)), this, SLOT(finished(int)), Qt::QueuedConnection); for (int i = 0; i < threadPool->maxThreadCount(); i++) { threadPool->start(webkit); qDebug() << "start(active):" << threadPool->activeThreadCount(); } } void MyThread::finished(int number) { qDebug() << "thread number is: " << number; qDebug() << "finished(active):" << threadPool->activeThreadCount(); }
mythread.h:
class MyThread : public QObject { Q_OBJECT public: explicit MyThread(QObject *parent = 0); ~MyThread(); void startMultiThreadLoad(QUrl url); public slots: void finished(int); private: webkitRunnable* webkit; QUrl globalURL; QThreadPool *threadPool; };
Whenever
webkit->load()
is executed, I got the following Application Output in Qt Creator:QObject: Cannot create children for a parent that is in a different thread. (Parent is QNetworkAccessManager(0x6f1598), parent's thread is QThread(0x65dfd0), current thread is QThread(0x6ccd28)
How can I solve it? Can anyone give an example? Thanks
-
user63898 over 11 yearsim in the same situation , where i can use the MoveToThread , if i use ThreadPool ?
-
kikeenrique over 11 yearsI've not any experience with moveToThread as it's said in the link I pasted before, it's not recomended. But, I think doc is quite nice in this case: qt-project.org/doc/qt-4.8/qobject.html#moveToThread