QT开发中文网

DWORD WINAPI MaintestServerStartThread(LPVOID lpParam) { // MainWindow *app = reinterpret_cast(lpParam); while (true) { QTcpSocket *socket = tcpClient::getInstance()->GetTcpSocket(); socket->connectToHost("127...

在你提供的代码中,出现了错误 invalid use of 'this' in non-member function,这是因为你试图在一个非成员函数(如 MaintestServerStartThread)中使用 this 指针。

解决方案

要解决这个问题,你可以考虑以下几种方法:

  1. 将函数改为类的成员函数:如果可能,将 MaintestServerStartThread 函数放入一个类中,这样就可以合法地使用 this。例如:
class MyClass {
public:
    void startServer() {
        QTcpSocket *socket = tcpClient::getInstance()->GetTcpSocket();
        
        socket->connectToHost("127.0.0.1", 8809); // 连接到服务器
        
        // ...
        
        QObject::connect(socket, &QTcpSocket::readyRead, this, [this]() {
            QByteArray data = socket->readAll(); // 读取所有可用数据
            datasize += data.size();
            tcpClient::getInstance()->processData(data);
        });
        
        // ...
    }
};
  1. 使用静态或全局对象代替:如果不能将该函数作为类的方法,可以将 lambda 中对 this 的引用改为传递具体对象的指针或者引用。这意味着你必须将需要访问的上下文对象作为参数传递给你的线程函数。

  2. 使用 std::function 和 std::bind:这也可以避免直接在 lambda 中使用 this,但是这涉及到更复杂的语法和管理生命周期的问题。

示例代码

假设我们采用第一种方案,将线程启动逻辑放入一个类中:

#include <QObject>
#include <QTcpSocket>
#include <QDebug>
#include <windows.h>

class MyTcpClient : public QObject {
    Q_OBJECT

public:
    DWORD WINAPI startServerThread(LPVOID lpParam) {
        while (true) {
            QTcpSocket *socket = tcpClient::getInstance()->GetTcpSocket();

            socket->connectToHost("127.0.0.1", 8809); // 连接到服务器

            if (socket->waitForConnected()) {
                qDebug() << "Connected to the server.";
                QObject::connect(socket, &QTcpSocket::readyRead, this, [this, socket]() { 
                    QByteArray data = socket->readAll(); // 读取所有可用数据
                    int datasize = data.size();          // 使用局部变量,不在这里累加
                    tcpClient::getInstance()->processData(data);
                });

                while (socket->state() == QAbstractSocket::ConnectedState) {
                    // 在这里可以执行其他操作,例如处理 UI 或休眠等。
                }

                socket->disconnectFromHost(); // 断开连接
            } else {
                qDebug() << "Failed to connect to the server.";
                Sleep(5000); // 使用 Sleep 而不是 QThread::sleep 在 Windows API 中。
            }
        }
        return 0;
    }
};

注意:

  • 我们通过调整结构使得信号和槽的连接处于类内,这样就能合法地使用 this 指针。
  • 确保包含正确的头文件,以及设置 Qt 的 MOC 系统,以便信号和槽机制正常工作。


    内容由零声教学AI助手提供,问题来源于学员提问
目录导航
  • 解决方案
  • 示例代码
  • 本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
    转载请注明出处:https://qt.0voice.com/?id=12906

    分享:
    扫描分享到社交APP
    上一篇
    下一篇
    发表列表
    游客 游客
    此处应有掌声~
    评论列表

    还没有评论,快来说点什么吧~

    联系我们

    在线咨询: 点击这里给我发消息

    微信号:3007537140

    上班时间: 10:30-22:30

    关注我们
    x

    注册

    已经有帐号?