Multithreading 如何克服这里的Qthread同步问题?

Multithreading 如何克服这里的Qthread同步问题?,multithreading,qt,Multithreading,Qt,我有一个加载网页并显示它的主线程。我有另一个线程正在运行,它将把调试消息打印到控制台上。但是,我看到在运行QT线程时,网页没有被加载。我试着把网页的加载放到线程的构造函数中,但这在这里也没有帮助 class MyJavaScriptOperations : public QObject { Q_OBJECT public: Q_INVOKABLE qint32 MultOfNumbers(int a, int b) { qDebug() << a *

我有一个加载网页并显示它的主线程。我有另一个线程正在运行,它将把调试消息打印到控制台上。但是,我看到在运行QT线程时,网页没有被加载。我试着把网页的加载放到线程的构造函数中,但这在这里也没有帮助

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的用途。