我在线程方面遇到了一些问题,因为我对它很陌生。
我得到了:
没有构造函数的实例" std :: thread :: thread" 匹配参数列表
参数类型是(void())
正好在
std::thread t1(TestPlay);
void CMusicTCPDlg::OnBnClickedBtplaymusic()
{
std::thread t1(TestPlay);
t1.join();
}
void CMusicTCPDlg::TestPlay()
{
if (CFugue::GetMidiOutPortCount() <= 0)
{
std::cerr << "No MIDI Output Ports found!";
exit(-1);
}
std::cout << "Playing Notes..";
CFugue::PlayMusicStringWithOpts(_T("C D E F G A B"), MIDI_MAPPER, 20);
}
我已经参考了一些线程页面,大多数都有一个像我一样的简单示例。
Visual Studio建议我使用&amp;在调用函数之前,它不会使用它。 我是否必须使用BackgroundWorker?
如果这是重复的话,真的很抱歉。谢谢!
答案 0 :(得分:8)
TestPlay
是一个成员函数,这意味着它的类型为void (CMusicTCPDlg::)()
。
您需要提供绑定版本以允许线程调用它:std::bind(&TestPlay, this)
。请注意,必须确保线程的存在时间不超过对象本身,否则将导致未定义的行为。 (它将在不存在的对象上执行函数)