使用QtConcurrent::运行的线程服务器
Threaded Server with QtConcurrent::run
我正在尝试开发一个线程服务器,该服务器包含一个运行方法,该方法将在另一个使用QtConcurrent::run的线程中运行。
我的第一个问题是:
我是对的,当我不创建一个不继承QTcpServer的服务器,只使用QTcpServer对象时。
第二个问题:
在另一个线程中只运行一个方法是错误的吗?因为我已经在C#和其他Qt示例中学会了这样做,他们将当前对象放在另一个线程中。
第三个问题:
为什么我收到这个消息:
QObject:无法为处于不同线程中的父级。(父级是MyServer(0x1ab1ca0),父线程是QThread(0x187a840),当前线程是QThread(0x1acfa90)
当我启动run方法时。
这是源代码:
myserver.h
#ifndef MYSERVER_H
#define MYSERVER_H
#include <QObject>
#include <QtNetwork/QTcpServer>
#include <QtConcurrentRun>
#include <QFuture>
#include "myclienthandle.h"
class MyServer : public QObject
{
Q_OBJECT
public:
explicit MyServer(QObject *parent = 0, const QString &ip = "Any", int port = 0);
explicit MyServer(const MyServer &server);
~MyServer();
QString IP() const;
void setIP(const QString &ip);
int Port() const;
void setPort(int port);
bool isAlive() const;
private:
QTcpServer *m_qtcpserListener;
QFuture<void> m_qftrRun;
QString *m_qstrIP;
int m_iPort;
int m_iClientID;
bool m_bRun;
void run();
signals:
void newConnection(MyClientHandle *clientHandle);
public slots:
void start();
void stop();
};
inline QString MyServer::IP() const
{
return *m_qstrIP;
}
inline void MyServer::setIP(const QString &ip)
{
m_qstrIP = new QString(ip);
}
inline int MyServer::Port() const
{
return m_iPort;
}
inline void MyServer::setPort(int port)
{
m_iPort = port;
}
inline bool MyServer::isAlive() const
{
return m_bRun;
}
#endif // MYSERVER_H
myserver.cpp
#include "myserver.h"
MyServer::MyServer(QObject *parent, const QString &ip, int port) :
QObject(parent), m_iClientID(0), m_bRun(false), m_qtcpserListener(0)
{
setIP(ip);
setPort(port);
}
MyServer::MyServer(const MyServer &server)
{
MyServer(server.parent(), server.IP(), server.Port());
}
MyServer::~MyServer()
{
if (m_qtcpserListener != 0)
stop();
}
void MyServer::run()
{
m_qtcpserListener = new QTcpServer(this);
if (!m_qtcpserListener->listen(QHostAddress(IP()), Port()))
{
return;
}
while (m_bRun)
{
if (m_qtcpserListener->waitForNewConnection(5000))
{
QTcpSocket *qtcpsoNextPending = m_qtcpserListener->nextPendingConnection();
emit newConnection(new MyClientHandle(qtcpsoNextPending));
}
}
}
void MyServer::start()
{
m_bRun = true;
m_qftrRun = QtConcurrent::run(this, &MyServer::run);
}
void MyServer::stop()
{
m_bRun = false;
if (m_qtcpserListener != 0 && m_qtcpserListener->isListening())
{
m_qtcpserListener->close();
}
m_qftrRun.cancel();
m_qftrRun.waitForFinished();
}
谢谢你的帮助。
您的问题是在不同的线程中运行MyServer::run
函数(通过QtConcurrent::run
,但在MyServer::run
函数中,您创建了一个新的TcpServer并为其提供了一个父级。在Qt中,在一个线程(并发线程)中创建的对象的父级不能是另一个线程拥有的对象(无论MyServer
的实例在哪个线程中,都可能是第一个线程)。
如果你已经克服了这一点,在不同于信号对象的线程中发出信号也会导致问题。您也可能在删除时遇到问题,因为您不应该在与拥有QObject的线程不同的线程中删除QObject
我的建议是使用QTcpServer
的内置线程机制。当您调用listen
时,函数将返回。然后,您可以连接到newConnection()
信号,以便在有连接挂起时得到通知,而不是等待连接(这可能会导致您认为需要同时运行该函数)。
相关文章:
- C/C++ Linux 上的多线程服务器/客户端崩溃
- 设计低线程争用的多线程聊天服务器
- C++服务器上的线程同步
- C++多线程服务器
- 卫生多线程服务器
- 在多线程c++服务器应用程序中处理非常量全局配置
- 多线程服务器在一个线程中处理多个客户端
- 在 GDB 中调试多线程服务器 - 查找每个线程的状态.执行时继续并停止
- 多线程服务器在不等待客户端连接的情况下退出
- 多线程服务器不工作
- 多线程服务器
- 调试多线程服务器
- 套接字在多线程服务器中不能正确接受
- C++具有 Winsock 和 std::thread 的多线程服务器
- c++中的多线程服务器,如何很好地终止线程和清理
- 多线程服务器设计
- 创建多线程服务器的问题
- 使用QtConcurrent::运行的线程服务器
- 带有std::线程强制转换变量的c++多线程服务器
- 多线程服务器与boost.Asio