我在本网站上看到的其他答案似乎与我的问题无关。无论如何,在我的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中,我在另一个函数的线程中调用了receive函数:
void MainWindow::on_pushButton_clicked()
{
connectFunction();
std::thread t1(receiveFunction);
t1.detach();
}
您可以尝试复制我的问题的示例是制作按钮和textEdit字段。让按钮的插槽调用一个编辑textEdit字段的函数。
编辑:我忘了提及:对于我的迷你示例,不要让它编辑textEdit字段,让它接收数据并编辑textEdit字段。
答案 0 :(得分:0)
错误消息似乎暗示reveiveFunction
函数有多个重载,但这可能会产生误导(如果上面的代码是正确的)。该行中存在两个固有错误:
std::thread t1(receiveFunction);
首先,如果不提供类型限定,则不能获取成员函数的地址(并且成员函数不会衰减为指向成员函数的指针)。第二个问题是非静态成员函数需要一个将在其上调用它的对象,而这个对象是您未提供的。该声明可以通过以下方式解决:
std::thread t1(&MainWindow::receiveFunction, this);
这将正确获取成员函数的地址,并提供将在其上评估函数的this
指针。