我有class Foo
,必须在构造函数上启动一个线程(我的类上的方法loop()
)。
我的类在头文件中是这样的:
class Foo
{
public:
Foo();
~Foo();
private
void loop();
std::thread m_thread;
//more stuff.
}
源文件是:
Foo::Foo()
{
m_thread(&Foo::loop, Foo()); // <---- No match for call '(std::thread) (void (Foo::*)(), Foo)'
m_thread.join();
}
Foo::~Foo()
{
m_thread.kill(); // <---- ??? how to do this?
}
void Foo::loop()
{
while()
{
//do stuff.
}
}
问题:
1 - 如何修复Foo constructor
上的错误?编译时我遇到"no match for call
“错误。
奖金问题:
2 - 如何杀死对象析构函数上的线程?
答案 0 :(得分:3)
1)你试图调用一个线程对象,而不是在这里初始化它:
Sub CreateFiberLossReport()
'
' CreateFiberFiles Macro
' - by Shikhar Parashar
TotalJoints = Range("F3").Value
For freqCtr = 1 To 3
freqSheet = Choose(freqCtr, "1550", "1625", "1310")
'fiberNum = "001"
For n = 9 To 176
For TJNum = 2 To TotalJoints + 1
ColToSelect = Choose(TJNum, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
Sheets(freqSheet).Select
rangeValue = ColToSelect & n
Range(rangeValue).Select
initPath = "C:\Users\Deepak\Desktop\Fazilka ferozpur AT\FRZ-JLB\["
formulaValue = "=VLOOKUP(MIN(IF(ABS('" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$C$28-" & ColToSelect & "5*1000)=MIN(ABS('" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$C$28-" & ColToSelect & "5*1000)),IF(ABS('" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$C$28-" & ColToSelect & "5*1000)< 150,'" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$C$28,))),'" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$E$28,3,FALSE)"
ActiveCell.Formula = formulaValue
Next
Next
Next
End Sub
您应该设置为其指定适当的值:
m_thread(&Foo::loop, Foo());
但这将默认构造另一个m_thread = std::thread(&Foo::loop, Foo());
对象,它将启动一个线程,该线程将默认构造一个Foo
对象,该对象将启动一个线程,该线程将...
所以,也许你的意思是在实例本身上启动线程,在这种情况下你需要
Foo
请注意,通常最好在构造函数初始化列表中初始化数据成员,但由于该线程调用m_thread = std::thread(&Foo::loop, this);
的成员,因此最好在对象具有该成员后启动它已经建成。
2)您可以在析构函数中加入线程。只要确保没有异常传播出析构函数。
答案 1 :(得分:1)
您还可以在构造函数初始化列表中定义m_thread对象,如:
Foo::Foo() : m_thread(&Foo::loop, this), End(false)
{
m_thread.join();
}
结束线程的一种简单方法是使用成员变量End,在构造函数中将其设置为true并在线程中循环它
Foo::~Foo()
{
End = true;
m_thread.join(); // <---- ??? how to do this?
}
void Foo::loop(Foo* This)
{
while(This->End == false)
{
/*Do something*/
}
}