Boost Thread int 参数到成员函数不起作用?

Posted

技术标签:

【中文标题】Boost Thread int 参数到成员函数不起作用?【英文标题】:Boost Thread int parameter to member function not working? 【发布时间】:2013-03-02 16:48:42 【问题描述】:

对线程和并发完全陌生,但我正在尝试将函数作为新线程启动,但我不明白我的错误。我收到一条类似于Candidate expects X arguments, 2 provided 的错误。 0 < X <= 9 重复此错误(2 除外)。但是,在我看到的每个示例中,它就像放置您的函数及其参数一样简单。我的代码如下:

培训师.cpp:

int time = 5; // for example

void Member::decrement(int seconds)
    while(seconds > 0)
        seconds--;
        Sleep(1000);
    
    isBusy = false;


void Member::startDecrement(string state)
    if (state == "busy") // isBusy is a private boolean, hence this
        isBusy = true;
        thread myThread = thread(decrement, time); // Thread for method
        myThread.join(); 
    else 
        isBusy = false;
    

但这不起作用?有人可以给我指导吗,我想做的很简单,但到目前为止我还没有找到适合我的方法。 thread 的替代品也很受欢迎,我已经看到 std::async 是一个选项,但它似乎不适用于我的编译器设置。

设置信息:-sdt=c++11MinGWWin64GCC 4.7.2

编辑

看到我因错误而被钉死,here is the entire error log。

我也试过答案中提供的代码,没有运气。

【问题讨论】:

如果您包含一个最小但完整的示例并包含实际的错误消息而不是其近似值,您可能会得到更好的答案。 难道你的参数time实际上是指标准的time()函数吗?如果重命名 time 变量会怎样? @NPE 这是一个最小但完整的示例,因为这就是导致错误的原因。 @Zackehh9lives:查看您的最小示例工作here @Zackehh9lives 您正在查看的成员函数示例是 decrementTime 吗?您遇到问题的事实表明您不了解某些内容(这是完全正常的!!),但这就是为什么我们需要一个 complete 示例,因为有时我们只是不理解知道我们遗漏了什么。 【参考方案1】:

由于您的编译错误似乎表明decrementTime 是一个成员函数,您需要提供一个对象来调用它(例如this 指针):

thread myThread = thread(&Trainer::decrementTime, this, transactionTime);

【讨论】:

@Zackehh9lives 没问题,我希望为什么我们需要一个完整的例子是有道理的(即使用decrementTime 作为成员函数)。请阅读:sscce.org 现在可以了,是的。我原以为两者之间没有区别(愚蠢,我知道)。【参考方案2】:

这是一个最小的完整示例:

#include <iostream>
#include <thread>

void decrement(int seconds) 
  std::cout << "seconds: " << seconds << std::endl;

int main(int arg, char * argv[]) 
  int time = 100;
  std::thread myThread(decrement, time);
  myThread.join();
  return 0;

这样编译:g++ thread.cpp -o thread -std=c++11 -pthread

下一次,给出这样的例子和完整的错误信息,并确保在编译器标志等技术细节中没有拼写错误。

【讨论】:

这就是我一直在做的事情(见更新的问题)。另请注意,我使用的是boost::thread 而不是std::thread (+1) 表明代码没有任何问题,并首先说明应该如何提出问题。 @Zackehh9lives:如果这听起来很苛刻,我们深表歉意,但您仍然没有给我们足够的信息来重现问题,更不用说解决问题了。 @NPE 我不明白你想要什么?这就是我正在运行的确切代码,其余代码与问题完全分开。 要切换到boost,只需更改两行#include &lt;boost/thread.hpp&gt;boost::thread myThread(decrement, time);

以上是关于Boost Thread int 参数到成员函数不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

boost::thread & 成员函数

Qt应用程序中的c ++ boost::thread() - 错误:函数参数过多

boost::thread类内成员函数调用返回unique_lock实例化错误

类内的Boost Thread无法访问成员变量

如何将一个类成员函数与param作为rvalue绑定到boost :: function? [关闭]

将参数传递给 boost::thread 没有重载函数需要 2 个参数