2014-07-14 3 views
0

스레드에서 QGraphicsScene으로 QGraphicsView을 업데이트해야합니다.스레드에서 장면 업데이트?

다음은 내가 뭘하고 있는지에 대한 pseudo'ish 코드 예제입니다.이 코드는 저에게 문제점 (런타임 오류)을 유발합니다.

내가 뭘 잘못하고 있고, 어떻게해야합니까?

메인 응용 프로그램 :

void Main::startThread() 
{ 
    view = new QGraphicsView(...); 
    thread = new MyThread(...); 
    connect(thread, SIGNAL(doSceneUpdate(QGraphicsScene*)), this, SLOT(updateScene(QGraphicsScene*))); 
    thread->start(); 
} 

void Main::updateScene(QGraphicsScene *scene) 
{ 
    view->SetScene(scene); 
    view->show(); 
    repaint(); 
} 

스레드 : 사전에

void MyThread::run() 
{ 
    QGraphicsScene *scene = new QGraphicsScene(...); 
    while(1) 
    { 
    //draw stuff on the scene 
    emit doSceneUpdate(scene); 
    //some delay 
    } 

감사합니다!

[편집] 오류 :

ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 
3e53c0. Receiver '' (of type 'QGraphicsScene') was created in thread 1476cd18", file c:\Qt\qt-everywhere-opensource-src-4.8.2\src\corelib\kernel\qcoreapplication.cpp, line 501 
+3

런타임 오류 란 무엇입니까? – DeepBlack

+0

Ive가 위 오류를 추가했습니다. 감사합니다 – thecoder

답변

1

로 부모와 QGraphicsScene 객체를 생성 시도 내가 뭘 잘못하고 있고 어떻게해야합니까?

내가 정식 대답은 here 생각 - 간단히 말해서, 당신은 QThread를 서브 클래스,하지만하지 않아야 문서 상태는 오히려 당신은 "베어"(예 - 서브 클래스되지 않음) QThread 객체를 사용하여 연결해야합니다 스레드가 시작된 후 그 스레드의 컨텍스트에서 실행될 슬롯에 대한 started() 신호. 그렇게하면 객체 - 스레드 소유권 문제가 자동으로 처리됩니다.

메인 Qt 스레드 이외의 스레드는 일반적으로 QGraphicsScene과 같은 GUI 개체를 직접 만들거나 상호 작용할 수 없다는 점에 유의하십시오. QT의 GUI 이벤트에서 동시에 작업이 진행되어 경쟁 조건이 발생하기 때문입니다. 고리. 별도의 스레드를 사용하려면 GUI 객체와 멀리 떨어져 있어야하며 대신 비동기 신호를 내 보내거나 이벤트를 메인/GUI 스레드로 보내 메인/GUI 스레드에서 수행하도록해야합니다 GUI 개체가 대신 업데이트됩니다.

+0

그래, 더 많은 조사가 끝나면 스레드가 다소 작동하는 방식이 바뀌었다. 이렇게하면 다른 문제가 생겨나지만 다른 주제에 관해서는 물어 봅니다. 감사. – thecoder

1

문제는 연결 라인입니다. 슬롯을 의미가없는 신호에 연결하고 있습니다. 당신은 슬롯으로 스레드에서 신호를 연결해야합니다 :

connect(thread, SIGNAL(doSceneUpdate(QGraphicsScene*)),this, SLOT(updateScene(QGraphicsScene*))); 
+0

사과드립니다. 예제 코드를 메모리에서 썼다가 잘못된 코드를 사용했습니다. 내 실제 출처에서 올바른 방법입니다. 나는 그 모범을 고쳤다. – thecoder

1

void MyThread::run() 
{ 
    QGraphicsScene *scene = new QGraphicsScene(...); 
    ... 

} 

당신이 QGraphicsScene()의 생성자에 this을 통과합니까?

이제 Main

MyThread의 아이를 통과하기 때문에, 오류의 한 원인이 될 수

스택 또는 NULL (new QGraphicsScene(0))

+0

댓글을 주셔서 감사합니다.그것은 실제 코드처럼 보이는 문제가 아니야. scene = new QGraphicsScene (0, 0, LCD_WIDTH, LCD_HEIGHT); – thecoder