Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法为位于不同线程中的父线程创建子线程_C++_Qt_Qthread_Qtcpsocket - Fatal编程技术网

C++ 无法为位于不同线程中的父线程创建子线程

C++ 无法为位于不同线程中的父线程创建子线程,c++,qt,qthread,qtcpsocket,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 *

我在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;
}
bool函数::prepareSocket(QString地址、int端口、qtcSocket*socket){
套接字->连接到主机(地址、端口);
如果(!socket->waitForConnected(全局::maxTimueToConnectByTCP)){

qDebug()试试:QObject::moveToThread。这应该可以做到。

您不应该从QThread派生。在从QObject派生的类上实现所有功能。然后您可以选择调用
moveToThread()
在该QObject上,将其移动到新线程。不过,您会发现,通常无需将其移动到新线程,因为现在您将拥有异步、非阻塞代码,不会暂停GUI线程

他们做到这一点的关键是永远不要使用
waitxxx
调用。每当你想等待某件事时,你会发现当那件事发生(或失败)时会发出信号。将一个插槽连接到该信号。您可能需要多次这样做--不同的插槽用于不同的信号。这就是正确编写异步、事件驱动应用程序的方法


只有在不存在其他API的情况下才使用阻塞调用。数据库驱动程序和名称解析程序在这方面是出了名的糟糕,但它们是孤独的反例。让它们孤独地死去吧,我说。

你在哪里创建套接字?好的,这很管用。我读过关于该方法的文章,但我认为它有不同的用途。我不知道如果在创建QThread后不调用moveToThread(this),则无法理解为什么创建到QThread中的QTcpSocket不会附加到该线程。为什么会出现这种行为?因为新线程中需要一个eventloop。请参阅本文:moveToThread(this)总是错误且不安全。您可以“推送”对象其他线程,而不是拉它们。没错,这不是一个好方法,而是一个简单的方法。你不应该从qthread派生。但是如果你移动到线程是让qobject工作的唯一方法。妈妈:不应该有“但是如果你这样做”。从概念上讲,QThread本身不是线程,而是线程控制器。线程控制器存在于其控制的线程中没有任何意义。线程终止后,您需要一个控制器保持活动状态,例如,向您发出线程确实终止的信号。