无法为位于其他线程中的父级创建子级

时间:2012-05-03 11:27:49

标签: c++ qt qthread qtcpsocket

我在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中定义了一组函数,这些函数没有定义到Functions类中,而是定义为命名空间。

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-&gt; connectToHost上我得到 QObject:无法为处于不同线程的父级创建子级。两次。

为什么?怎么了?

2 个答案:

答案 0 :(得分:1)

尝试:QObject :: moveToThread。这应该可以解决问题。

答案 1 :(得分:1)

你不应该从QThread派生。在从QObject派生的类上实现所有内容。然后,您可以选择在该QObject上调用moveToThread()以将其移动到新线程。但是,您会发现通常无需将其移动到新的线程无论如何,因为现在您将拥有不会阻止GUI线程的异步,非阻塞代码。

他们做的关键是永远不要使用waitxxx来电。每当你想等待某事时,你会发现当事情发生(或失败)时会发出信号。将插槽连接到该信号。您可能需要多次执行此操作 - 针对不同信号的不同插槽。这就是您正确编写异步,事件驱动的应用程序的方法。

如果不存在其他API,您只会使用阻止调用。数据库驱动程序和名称解析器在这方面是出了名的坏事,但它们是孤独的反例。我说,让他们孤独地死去。

相关问题