• 6688阅读
  • 5回复

关于多线程服务器的问题 [复制链接]

上一主题 下一主题
离线hongwang
 
只看楼主 倒序阅读 楼主  发表于: 2008-06-23
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
关键词: 多线程

目标是: 以一个对话框作服务器主界面,上面放一个QListWidget,  里面显示所有当前在线用户的名字。  为每个在线用户启动一个单独的线程提供服务。

设计:  对话框类ReceiverDialog从QDialog继承而来, 服务器类 ReceiverServer 从QTcpServer继承而来, 线程类ReceiverThread从QThread继承而来。
在ReceiverDialog类中添加一个成员变量 ReceiverServer server;
class ReceiverDialog : public QDialog

..............(省略)
private:       
        ReceiverServer server;
..............(省略)
}
并在ReceiverDialog的改造函数中开启服务器:
server.listen(QHostAddress::Any, 9090);

重写QTcpServer的incomingConnection函数
ReceiverServer::incomingConnection(int socketDescriptor)
{
    ReceiverThread *thread = new ReceiverThread(socketDescriptor, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}
当有新连接时,自动开启一个新的ReceiverThread线程,在该线程的run()函数中接收数据。

现在的问题是, 在run()中得到用户名的信息后,怎样把这个信息送到Dialog中显示? 我想在run()中发射一个信号,但是ReceiverThread跟ReceiverDialog之间还隔着一层ReceiverServer, 这个信号不能直接送到ReceiverDialog中。 如果在ReceiverThread中写connect()的话,不知道接收者该怎么写; 如果在ReceiverServer中写connect()的话,也不知道收者该怎么写; 如果在ReceiverDialog中写connect()的话, 不知道发射者该怎么写。
在线XChinux

只看该作者 1楼 发表于: 2008-06-23
将ReceiveServer的parent设置为ReceiverDialog,
这样每个ReceiverThread的构造函数中不是已经将ReceiverServer的指针传进去了么?这就不是能找到ReceiverDialog了么?!
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线mofei252

只看该作者 2楼 发表于: 2008-06-23
信号可以连接槽,同时也可以连接信号。
比方说,你可以用A类的信号连接B类的信号,用B类的信号连接C类的槽,这样不就是A类的信号连接C类的槽了吗?
离线hongwang
只看该作者 3楼 发表于: 2008-06-23
引用第1楼XChinux于2008-06-23 15:57发表的  :
将ReceiveServer的parent设置为ReceiverDialog,
这样每个ReceiverThread的构造函数中不是已经将ReceiverServer的指针传进去了么?这就不是能找到ReceiverDialog了么?!


您的意思是用多继承?  让一个类同时继承自QDialog和QTcpServer ?
[ 此贴被hongwang在2008-06-23 19:49重新编辑 ]
离线hongwang
只看该作者 4楼 发表于: 2008-06-23
引用第1楼XChinux于2008-06-23 15:57发表的? :
将ReceiveServer的parent设置为ReceiverDialog,
这样每个ReceiverThread的构造函数中不是已经将ReceiverServer的指针传进去了么?这就不是能找到ReceiverDialog了么?!


哦,?  我把parent 跟继承搞混了.

按照您的指点, 我在 ReceiveDialog 的构造函数中加了    server.setParent(this);
在 void AReceiverServer::incomingConnection(int socketDescriptor) 中加了:
connect(thread, SIGNAL(sig_userConnected(quint32)), this->parent(), SLOT(slt_userConnected(quint32)));
实现了想要的效果。  不知道您说的是不是这个意思? 
多谢!
[ 此贴被hongwang在2008-06-23 21:28重新编辑 ]
在线XChinux

只看该作者 5楼 发表于: 2008-06-23
引用第4楼hongwang于2008-06-23 20:29发表的  :
哦,?  我把parent 跟继承搞混了.
按照您的指点, 我在 ReceiveDialog 的构造函数中加了     server.setParent(this);
.......


成功就好。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个