【问题标题】:std::thread::thread(<unresolved overloaded function type>) in QtQt 中的 std::thread::thread(<unresolved 重载函数类型>)
【发布时间】:2014-03-27 03:07:02
【问题描述】:

我在此网站上阅读的其他答案似乎与我的问题无关。无论如何,在我的 mainwindow.cpp 文件中,我有一个需要访问 ui 命名空间的函数:

 do
    {
        intrecv= recv(s1, buffer, 10000,0);
        if(intrecv > 0)
        {
            recvData = buffer;
            ui->textEdit->setText("Connection occurred.\n");
        }   
    }while(intrecv > 0);

这是我的预处理器命令:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <thread>
#include <string>
#include <QString>

在我的 mainwindow.h 文件中,我对接收函数进行了原型设计:

    class MainWindow : public QMainWindow
{
    Q_OBJECT
    void receiveFunction();

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_lineEdit_returnPressed();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

然后,在 mainwindow.cpp 中,我在另一个函数的线程中调用了该接收函数:

    void MainWindow::on_pushButton_clicked()
{
    connectFunction();
    std::thread t1(receiveFunction);
    t1.detach();
}

您可以尝试复制我的问题的一个示例是制作一个按钮和一个 textEdit 字段。让按钮的插槽调用编辑 textEdit 字段的函数。

edit:我忘了提一下:对于我的小例子,不要让它只编辑 textEdit 字段,让它接收数据并编辑 textEdit 字段。

【问题讨论】:

    标签: c++ multithreading qt winsock2


    【解决方案1】:

    错误消息似乎暗示reveiveFunction 函数有多个重载,但这可能会产生误导(如果上面的代码是正确的)。该行有两件事本质上是错误的:

    std::thread t1(receiveFunction);
    

    首先,您不能在不提供类型限定的情况下获取成员函数的地址(并且成员函数不会衰减为指向成员函数的指针)。第二个问题是,一个非静态成员函数需要一个对象来调用它,而您没有提供该对象。可以通过以下方式修复该语句:

    std::thread t1(&MainWindow::receiveFunction, this);
    

    这将正确获取成员函数的地址,并提供将在其上评估函数的this 指针。

    【讨论】:

    • 是的,我在另一个线程中看到了这个解决方案。不幸的是,我在尝试时遇到了运行时错误。编辑:为了清楚起见,它确实可以编译。
    • @user3466884:那么你有另一个问题,但打破这个不会帮助你处理另一个问题。您是否在线程完成之前销毁 MainWindow 对象?
    • 不,没有破坏 MainWindow 对象。
    • 啊,我明白了问题所在。我在我的程序中将另一个线程命名为相同的东西,这可能导致了错误。但是,该线程似乎没有像我希望的那样接收任何数据包。
    • 编辑:再次出现运行时错误。它似乎正在接收数据,但在收到一些数据后停止工作。可能与我如何解析数据包有关。编辑:现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多