C++ 无法为位于不同线程中的父线程创建子线程
我在MyThread.cpp和.h中定义了一个QThread。我有一个私人的QTcpSocketC++ 无法为位于不同线程中的父线程创建子线程,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 *
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本身不是线程,而是线程控制器。线程控制器存在于其控制的线程中没有任何意义。线程终止后,您需要一个控制器保持活动状态,例如,向您发出线程确实终止的信号。