Qt中的线程定时重连可以通过使用QTimer和信号槽来实现。下面是一个简单的示例代码:
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread(QObject *parent = nullptr) : QThread(parent) {}
signals:
void reconnect();
protected:
void run() override {
QTcpSocket socket;
connect(&socket, &QTcpSocket::disconnected, this, &MyThread::reconnect);
bool connected = false;
while (!connected) {
socket.connectToHost("localhost", 8080);
if (socket.waitForConnected(5000)) {
connected = true;
} else {
emit reconnect();
msleep(1000);
}
}
// do something with the socket...
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
m_thread = new MyThread(this);
connect(m_thread, &MyThread::reconnect, this, &MainWindow::onReconnect);
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, [this](){
if (!m_thread->isRunning()) {
m_thread->start();
}
});
m_timer->start(5000); // reconnect every 5 seconds
}
private slots:
void onReconnect() {
// show a message or update UI to indicate reconnection attempt
}
private:
MyThread *m_thread;
QTimer *m_timer;
};
在上面的代码中,MyThread类是一个自定义的线程类,它会尝试连接到主机和端口(这里是本地主机和8080端口),如果连接失败,则会发出一个重连信号。MainWindow类是主窗口类,它创建并启动MyThread线程,并使用QTimer周期性地检查线程是否已经停止运行,如果停止了则重新启动线程。同时,MainWindow类还通过信号槽机制来接收MyThread发出的重连信号,并更新UI以指示正在进行重连尝试。