std :: thread :: thread()在Qt中
问题描述:
我在这个网站上看到的其他答案似乎与我的问题没有关系。不管怎样,在我的mainwindow.cpp文件我有需要的用户界面命名空间访问的功能:std :: thread :: thread(<unresolved overloaded function type>)在Qt中
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文件I原型接收功能如:
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字段的函数。
编辑:我忘了提及:对于我的小例子,不要只编辑textEdit字段,让它接收数据并编辑textEdit字段。
答
错误消息似乎暗示reveiveFunction
函数存在多重过载,但这可能会产生误导(如果上面的代码是正确的)。有两件事情本身错行:
std::thread t1(receiveFunction);
首先是,你不能把一个成员函数的地址,而不提供类型的资格(和成员函数不衰减的指针成员函数)。第二个问题是非静态成员函数需要一个将被调用的对象,而这个对象并没有提供。该声明可以固定通过执行:
std::thread t1(&MainWindow::receiveFunction, this);
这将正确地采取成员函数的地址,并提供this
指针在其上的功能进行评价。
是的,我在另一个线程中看到了这个解决方案。不幸的是,当我尝试它时,出现运行时错误。编辑:要清楚,它确实编译。 – user3466884
@ user3466884:然后你有另一个问题,但打破这不会帮助你处理其他问题。线程完成之前是否销毁了'MainWindow'对象? –
不,不破坏MainWindow对象。 – user3466884