2012-05-03 4 views
0

MyThread.cpp 및 .h에 QThread가 정의되어 있습니다. 거기에 개인 QTcpSocket 있습니다.다른 스레드에있는 부모에 대해 자식을 만들 수 없습니다.

한편
class MyThread: public QThread { 

    Q_OBJECT 

public: 
    MyThread(); 
    virtual ~MyThread(); 

public slots: 
    void reconnect(); 
signals: 

protected: 
    void run(void); 

private: 
    QTcpSocket *socket; 
}; 

void MyThread::run(void) { 
    bool connected = false; 

    connected = prepareSocket(QString::fromLatin1((Global::directionIPSerialServer).toLocal8Bit().data()), 8008, socket); 
} 

, 나는 기능 클래스에 정의되지 않은 Functions.cpp 및 .H에 정의 된 함수의 집합,하지만 네임 스페이스를 가지고있다. 내가 틀렸다면

bool Functions::prepareSocket(QString address, int port, QTcpSocket *socket) { 
    socket->connectToHost(address, port); 
    if(!socket->waitForConnected(Global::maxTimueToConnectByTCP)){ 
     qDebug()<<"Error: "<<socket->errorString(); 
     return false; 
    } 
    return true; 
} 

그럼,이 호스트로 MyThread의 QTcpSocket를 연결하는 기능으로 함수를 호출 할 때, 나는 내가 전화 해요 이후, 나는 동일한 스레드에서 오전 랬있어, 날 수정 함수는 내가 작성한 스레드에서 가져온 것이고 다른 스레드는 아닙니다.

그럼에도 불구하고 socket-> connectToHost에서 QObject : 다른 스레드에있는 부모에 대해 자식을 만들 수 없습니다. 두 번.

왜 그럴까요? 뭐가 문제 야?

+1

어디에서 소켓을 만드십니까? – Nick

답변

0

시도해보십시오. QObject :: moveToThread. 이것은 트릭을해야합니다.

+0

좋습니다. 나는 그 방법에 대해 읽었지만 그것이 다른 목적을위한 것이라고 생각했습니다. 왜 QTcpSocket QThread로 만든 이유는 이해하지 못한다면 당신이 그것을 만든 후에 moveToThread (이)를 호출하지 않으면 해당 스레드에 연결되어 있지 않습니다. 왜 이런 행동입니까? –

+0

새 스레드에서 이벤트 루프가 필요하기 때문입니다. 이 문서를 참조하십시오 : http://doc.qt.nokia.com/4.7-snapshot/thread-basics.html – muma

+1

moveToThread (this)는 항상 잘못되어 안전하지 않습니다. 객체를 당기지 않고 다른 스레드로 "밀어 넣을"수 있습니다. –

1

QThread에서 파생해서는 안됩니다. QObject에서 파생 된 클래스의 모든 것을 구현합니다. 그런 다음 QObject에서 moveToThread()을 호출하여 새 스레드로 이동할 수 있습니다. 그러나 이제는 새로운 스레드로 이동할 필요가 없다는 것을 알게 될 것입니다. 이제는 GUI 스레드를 정지시키지 않는 비동기식, 비 차단 코드가 있기 때문에 찾을 수 있습니다.

그들이하는 일의 핵심은 결코 waitxxx 전화를 사용하지 않는 것입니다. 을 기다릴 때마다을 기다리면 신호이 발생하고 그 일이 발생하거나 실패 할 수 있습니다. 슬롯을 해당 신호에 연결하십시오. 여러 신호를 위해 다른 슬롯을 여러 번 사용해야 할 수도 있습니다. 이것이 비동기식 이벤트 구동 애플리케이션을 올바르게 코딩하는 방법입니다.

다른 API가없는 경우 차단 호출을 사용해야합니다. 데이터베이스 드라이버와 이름 해석자는이 점에서 악명이 높지만 외로운 반례입니다. 그들이 고독에서 죽게 내버려둬.