Multithreading 如何克服这里的Qthread同步问题?
我有一个加载网页并显示它的主线程。我有另一个线程正在运行,它将把调试消息打印到控制台上。但是,我看到在运行QT线程时,网页没有被加载。我试着把网页的加载放到线程的构造函数中,但这在这里也没有帮助Multithreading 如何克服这里的Qthread同步问题?,multithreading,qt,Multithreading,Qt,我有一个加载网页并显示它的主线程。我有另一个线程正在运行,它将把调试消息打印到控制台上。但是,我看到在运行QT线程时,网页没有被加载。我试着把网页的加载放到线程的构造函数中,但这在这里也没有帮助 class MyJavaScriptOperations : public QObject { Q_OBJECT public: Q_INVOKABLE qint32 MultOfNumbers(int a, int b) { qDebug() << a *
class MyJavaScriptOperations : public QObject {
Q_OBJECT
public:
Q_INVOKABLE qint32 MultOfNumbers(int a, int b) {
qDebug() << a * b;
return (a*b);
}
};
#if 1
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread();
public:
void run();
};
MyThread::MyThread()
{
qDebug()<<"Constructor called";
QWebView *view = new QWebView();
view->resize(400, 500);
view->page()->mainFrame()->addToJavaScriptWindowObject("myoperations", new MyJavaScriptOperations);
view->load(QUrl("./shreyas.html"));
view->show();
this->run();
}
void MyThread::run()
{
qDebug()<<"Thread running";
while(1)
{
qDebug()<<"Fire Callback now";
}
}
#endif
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyThread t;
//t.run();
return a.exec();
}
MyJavaScriptOperations类:公共QObject{
Q_对象
公众:
Q_可调用qint32多个数字(int a,int b){
qDebug()mainFrame()->addToJavaScriptWindowObject(“myoperations”,新的MyJavaScriptOperations);
查看->加载(QUrl(“./shryas.html”);
查看->显示();
此->运行();
}
void MyThread::run()
{
qDebug()仅仅因为代码在QThread的子类中,并不意味着代码在该线程中执行。主线程构造对象,构造函数调用
run()
。这意味着run
方法的代码仍然在主线程中执行,并且当它阻塞时,a.exec()行
从未被调用,并且主线程从未获得绘制事件等所需的事件循环
您需要做的是启动线程并等待执行run()
:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// TODO: Code for your web view goes here. You will probably need to
// pass the created web view into the constructor of MyThread
MyThread t;
// start the thread - this will put an event in the main event loop
t.start();
// start the event loop - this will lead to MyThread::run() being called
return a.exec();
}
这足以让您的示例运行,但在关闭web视图时会出现错误,因为您使用线程的方式不是预期的方式:如果要使代码稳定,请将run()的代码放入
方法,并使用默认的QThread
进行管理,而无需子类化QThread
我建议您阅读,这也适用于早期版本的Qt。我已经尝试过了,但它不起作用。网页从未像您所说的那样加载-a.exec从未有机会运行。好的,明白了。键是start()。start()将在事件循环中推送线程。是的。无论是哪种方式,请查看我提供的链接中的示例。它们会让您大致了解QThread的用途。