【发布时间】:2016-03-16 13:22:26
【问题描述】:
我遇到了一个问题,曾多次在此处询问类似情况,但我在这些主题中找不到解决方案。
我有一个主类,我想通过 qt-network 支持来扩展它,并通过一个附加类来扩展它。让我将源代码分解为相关部分:
主类
.h
class MainClass: public QObject{
Q_OBJECT
public:
[...]
private:
NetworkSupport * netSupport;
};
.cpp
MainClass::MainClass()
{
[...]
netSupport
netSupport = new NetworkSupport(this->thread());
netSupport->start();
[...]
}
网络类
.h
class NetworkSupport : public QThread
{
Q_OBJECT
public:
NetworkSupport(QThread *mainThread);
~NetworkSupport();
QByteArray readData();
void sendData(QByteArray *msg);
public slots:
void acceptConnection();
void receive();
void run();
private:
QByteArray curMessage;
QThread* libThread;
QEventLoop initWlan;
protected:
QTcpServer server;
QTcpSocket* client;
};
.cpp
NetworkSupport::NetworkSupport(QThread* mainThread)
{
libThread = mainThread;
server.moveToThreaD(libThread);
server.listen(QHostAddress::Any, 5200);
QMetaObject::invokeMethode(&initWlan, "quit", Qt:QueuedConnection);
initWlan.exec();
}
void NetworkSupport::run(){
connect(&server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
}
void NetworkSupport::acceptConnection()
{
client = server.nextPendingConnection();
client->moveToThread(libThread);
if (client->state() == QAbstractSocket::ConnectedState)
connect(client, SIGNAL(readyRead()), this, SLOT(receive()));
}
void NetworkSupport::receive()
{
curMessage = client->readAll();
}
void NetworkSupport::sendData(QByteArray* msg)
{
if(client->state() == QAbstractSocket::ConnectedState)
{
client->moveToThread(libThread);
printf("Sending a message %s\n",msg->data());
client->write(*msg);
client->waitForBytesWritten();
}
}
我知道我通常不需要这么多地指定moveToThread(),但如果它们都存在或被删除,它最终不会改变任何事情。
但是在执行时我在sendData() 中的client->write(*msg) 处收到错误消息,即:
[...]
Sending a message ?r
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QnativeSocketEngine(0x2afc660), parent's thread is QThread(0x1b59210), current thread is QThread(0x7f6a70026b60)
QSocketNotifier: Can only be used with threads started with QThread
[...]
它看起来确实像一个警告,因为该程序之后仍在执行,但我没有收到来自客户端的任何消息(即receive() 永远不会执行),我猜这是因为最后一行来自错误消息。
会不会是这个错误信息只是具有误导性,如果是这样,它的实际含义是什么,还是我做错了什么?
【问题讨论】:
-
sendData 是如何被调用的?
-
@Kamil Klimek 这是一个公共功能。 IE。每当用户/主应用程序需要发送消息时。没有任何信号/插槽
-
我需要知道它是如何被调用的——重要的是要知道你在哪个线程上执行 write on socket
-
@KamilKlimek 例如:
QByteArray msg = QByteArray::fromRawData("?r",2);然后netSupport->sendData(&msg); -
好的,你没有完全理解我的问题,所以我会问另一个问题 - 你是否 100% 确定,你在与套接字所在的线程相同的线程上调用 sendData 跨度>
标签: c++ multithreading qt network-programming signals-slots