C++/多线程:构造函数"std::thread::thread"的实例没有匹配的参数列表。

8

我在线程编程方面遇到了一些问题,因为我很新手。

我得到了以下错误:

没有与参数列表匹配的构造函数“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建议在调用函数之前使用&,但它不起作用。 我是否必须使用BackgroundWorker来完成?

非常抱歉如果这是重复的。谢谢!

1个回答

11

TestPlay是一个成员函数,意味着它的类型为void (CMusicTCPDlg::)()

您需要提供一个绑定版本,以允许线程调用它:std::bind(&TestPlay, this)。请注意,您必须确保线程存在的时间不比对象本身更长,否则会导致未定义的行为(它将在不存在的对象上执行函数)。


1
作为一种替代方案,如果不需要访问任何成员变量(在给定的代码中看起来像这样),该函数可以声明为静态。 - Matthias247
我明白了,这确实解决了问题!非常感谢你们! - Cattani
1
使用成员函数启动线程 - std::thread可以同时接受成员函数和实例指针。 - jozxyqk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接