我怎样才能将 QtcpSockets 连接到大约 100 台服务器而不会 UI 挂起?
How can I connect QtcpSockets to about 100 servers without a UI hang?
如何在没有 UI 挂起的情况下将 QtcpSockets 连接到大约 100 台服务器?
当我创建 100 个 QTcpSocket 以连接到每个服务器并调用 connectToHost() 函数时,QDialog 卡住了。有没有办法 运行 将 connectToHost() 部分作为后台作业?
因此,建立了所有连接,但在尝试连接时(调用 connectToHost() UI 处于 'No Response' 状态。
// onConnectToICPMC is the slot function connected to the dialog button pressed signal
void WidgetUploadFile::onConnectToICPMC()
{
// m_tcpClients is a QVector containing a custm QObject Class that manages QTcpSocket
for(int i = 0; i < m_tcpClients.size(); ++i)
{
if(m_tcpClients.at(i)->state() != QAbstractSocket::ConnectedState)
{
m_tcpClients.at(i)->connectToServer(); // Call the connectToHost() function of QTcpSocket.
}
emit sendConnProgBarUpdate(i+1);
emit sendCurrentSockLog(m_tcpClients.at(i)->ipAddress(), m_tcpClients.at(i)->state());
}
}
每个 QTcpSocket 连接到服务器时挂起的对话框。:
在所有 QTcpSockets 尝试连接到服务器之后:
耗时的任务不应该运行在主线程上。在这种情况下,有 2 种策略:
- 线程的使用。
- 分成子任务,每T秒分段执行
在这种情况下,我认为第二个选项是使用 QTimeLine
的最佳选择。
*.h
private:
void handleFrameChanged(int i);
QTimeLine timeLine;
*.cpp
{
// constructor
timeLine.setRange(0, m_tcpClients.size()-1);
connect(&timeLine, &QTimeLine::frameChanged, this, &WidgetUploadFile::handleFrameChanged);
}
void WidgetUploadFile::onConnectToICPMC()
{
timeLine.start();
}
void WidgetUploadFile::handleFrameChanged(int i){
auto client = m_tcpClients.at(i);
if(client->state() != QAbstractSocket::ConnectedState){
client->connectToServer();
}
emit sendConnProgBarUpdate(i + 1);
emit sendConnProgBarUpdate(client->ipAddress(), client->state());
}
如何在没有 UI 挂起的情况下将 QtcpSockets 连接到大约 100 台服务器?
当我创建 100 个 QTcpSocket 以连接到每个服务器并调用 connectToHost() 函数时,QDialog 卡住了。有没有办法 运行 将 connectToHost() 部分作为后台作业?
因此,建立了所有连接,但在尝试连接时(调用 connectToHost() UI 处于 'No Response' 状态。
// onConnectToICPMC is the slot function connected to the dialog button pressed signal
void WidgetUploadFile::onConnectToICPMC()
{
// m_tcpClients is a QVector containing a custm QObject Class that manages QTcpSocket
for(int i = 0; i < m_tcpClients.size(); ++i)
{
if(m_tcpClients.at(i)->state() != QAbstractSocket::ConnectedState)
{
m_tcpClients.at(i)->connectToServer(); // Call the connectToHost() function of QTcpSocket.
}
emit sendConnProgBarUpdate(i+1);
emit sendCurrentSockLog(m_tcpClients.at(i)->ipAddress(), m_tcpClients.at(i)->state());
}
}
每个 QTcpSocket 连接到服务器时挂起的对话框。:
在所有 QTcpSockets 尝试连接到服务器之后:
耗时的任务不应该运行在主线程上。在这种情况下,有 2 种策略:
- 线程的使用。
- 分成子任务,每T秒分段执行
在这种情况下,我认为第二个选项是使用 QTimeLine
的最佳选择。
*.h
private:
void handleFrameChanged(int i);
QTimeLine timeLine;
*.cpp
{
// constructor
timeLine.setRange(0, m_tcpClients.size()-1);
connect(&timeLine, &QTimeLine::frameChanged, this, &WidgetUploadFile::handleFrameChanged);
}
void WidgetUploadFile::onConnectToICPMC()
{
timeLine.start();
}
void WidgetUploadFile::handleFrameChanged(int i){
auto client = m_tcpClients.at(i);
if(client->state() != QAbstractSocket::ConnectedState){
client->connectToServer();
}
emit sendConnProgBarUpdate(i + 1);
emit sendConnProgBarUpdate(client->ipAddress(), client->state());
}