2014-02-26 1 views
1

웹 페이지를로드하고 표시하는 메인 스레드가 있습니다. 다른 스레드가 실행되고 있는데, 디버그 메시지가 콘솔에 출력됩니다. 그러나 QT-Thread를 실행하면 웹 페이지가로드되지 않습니다. 스레드의 생성자에 웹 페이지 로딩을 시도했지만 여기서도 도움이되지 않습니다. 여기에 코드가 있습니다.Qthread 동기화 문제를 극복하는 방법은 무엇입니까?

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(); 
} 

답변

1

코드가 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(); 
} 

이 실행 예를 얻기에 충분하지만, 당신의 방법으로 웹보기를 닫을 때 당신이 오류를 얻을 것이다 코드를 안정화하려면 코드 run()의 코드를 별도의 작업자 클래스에 넣고 QThread의 하위 클래스를 지정하지 않고 기본값 인 QThread을 사용하여 코드를 관리하십시오.

Qt의 이전 버전에도 적용되는 Qt5 Documentation on threads을 읽는 것이 좋습니다.

+0

나는 이것을 시도했지만 작동하지 않는다. 웹 페이지는 절대로로드되지 않습니다. a.exec은 실행할 기회가 없었습니다. –

+0

알았어. 열쇠는 start()입니다. start()는 이벤트 루프에서 스레드를 푸시합니다. –

+0

예. 어느 쪽이든, 내가 제공 한 링크의 예를 살펴보십시오. QThread의 사용 방법에 대한 일반적인 느낌을 주어야합니다. –

관련 문제