【发布时间】:2018-01-18 22:43:32
【问题描述】:
假设您需要与设备保持 256 个 tcp 连接,只是为了偶尔发送命令。我想并行执行此操作(它需要阻塞,直到它得到响应),我正在尝试使用 QThreadPool 来实现此目的,但我怀疑它是否可能。
我尝试使用 QRunnable,但我不确定套接字在线程之间的行为方式(套接字应该只在创建它们的线程中使用?)
我也担心这个解决方案的效率,如果有人可以提出一些替代方案,我会很高兴,不一定使用 QT。
下面我发布了一些sn-ps的代码。
class Task : public QRunnable {
Task(){
//creating TaskSubclass instance and socket in it
}
private:
TaskSubclass *sub;
void run() override {
//some debug info and variable setting...
sub->doSomething( args );
return;
}
};
class TaskSubclass {
Socket *sock; // socket instance
//...
void doSomething( args )
{
//writing to socket here
}
}
class MainProgram : public QObject{
Q_OBJECT
private:
QThreadPool *pool;
Task *tasks;
public:
MainProgram(){
pool = new QThreadPool(this);
//create tasks here
}
void run(){
//decide which task to start
pool->start(tasks[i]);
}
};
【问题讨论】:
-
请问您为什么要使用多个线程来解决问题? Qt 的事件系统能够通过一个线程轻松处理数百个 Tcp 连接,还是您的“套接字数据处理程序”逻辑阻塞了主线程?
-
感谢您的评论,我刚刚编辑了帖子。它需要阻塞直到得到响应。
-
你不使用信号槽机制有什么原因吗?您可以只使用 QTcpSocket 的 readyRead-Signal 并将其连接到插槽。
-
如果我错了请纠正我,但在此解决方案中,插槽将按顺序执行,而不是并行执行。
标签: c++ multithreading qt sockets threadpool