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指针在其上的功能进行评价。

+0

是的,我在另一个线程中看到了这个解决方案。不幸的是,当我尝试它时,出现运行时错误。编辑:要清楚,它确实编译。 – user3466884

+0

@ user3466884:然后你有另一个问题,但打破这不会帮助你处理其他问题。线程完成之前是否销毁了'MainWindow'对象? –

+0

不,不破坏MainWindow对象。 – user3466884