如何使用另一个类中的公共成员函数作为参数调用线程

How to call thread with a public member function from another class as argument

本文关键字:函数 参数 线程 调用 成员 另一个 何使用      更新时间:2023-10-16

我已经检查了使用成员函数和类似帖子启动线程,并按照说明进行操作,但是我收到此错误消息:

'

std::invoke':未找到匹配的重载函数

SerialPort.h

#include <array>
#include <string>
class AudioClass
{
public:
void playAudio(std::array<std::string, 11> turretDetectionWavFiles, std::array<std::string, 6> turretActivationWavFiles,
std::array<std::string, 4> turretSearchingWavFiles, std::array<std::string, 16> turretPowerDownWavFiles, std::array<std::string, 3> turretAttackWavFiles, std::array<std::string, 11> turretMovedWavFiles,
std::array<std::string, 12> turretDie);
};

主.cpp

#include <iostream>
#include <array>
#include <string>
#include <thread>
#include "SerialPort.h"
std::array<std::string, 11> turretDetectionWavFiles{ "alarm.wav", "alert.wav",  "active.wav", "turret_active_1.wav", "turret_active_2.wav", "turret_active_3.wav", "turret_active_4.wav", "turret_active_5.wav",
"turret_active_6.wav", "turret_active_7.wav", "turret_active_8.wav" };
std::array<std::string, 6> turretActivationWavFiles{ "turret_deploy_1.wav", "turret_deploy_2.wav", "turret_deploy_3.wav", "turret_deploy_4.wav", "turret_deploy_5.wav",
"turret_deploy_6.wav" };
std::array<std::string, 4> turretSearchingWavFiles{ "turret_search_1.wav", "turret_search_2.wav", "turret_search_3.wav", "turret_search_4.wav" };
std::array<std::string, 16> turretPowerDownWavFiles{ "turret_disabled_1.wav", "turret_disabled_2.wav", "turret_disabled_3.wav", "turret_disabled_4.wav", "turret_disabled_5.wav",
"turret_disabled_6.wav", "turret_disabled_7.wav", "turret_disabled_8.wav", "turret_retire_1.wav", "turret_retire_2.wav",
"turret_retire_3.wav", "turret_retire_4.wav", "turret_retire_5.wav", "turret_retire_6.wav", "turret_retire_7.wav", "retract.wav" };
std::array<std::string, 3> turretAttackWavFiles{ "turret_fire_4x_01.wav", "turret_fire_4x_02.wav", "turret_fire_4x_03.wav" };
std::array<std::string, 11> turretMovedWavFiles{ "turretlaunched10.wav", "turret_pickup_1.wav", "turret_pickup_2.wav", "turret_pickup_3.wav", "turret_pickup_4.wav", "turret_pickup_5.wav",
"turret_pickup_6.wav", "turret_pickup_7.wav", "turret_pickup_8.wav", "turret_pickup_9.wav", "turret_pickup_10.wav" };
std::array<std::string, 12> turretDie{ "sp_sabotage_factory_good_fail01.wav", "sp_sabotage_factory_good_fail04.wav", "sp_sabotage_factory_good_fail06.wav",
"sp_sabotage_factory_good_fail05.wav", "sp_sabotage_factory_good_fail07.wav", "turret_tipped_1", "turret_tipped_2", "turret_tipped_3",
"turret_tipped_4", "turret_tipped_5", "turret_tipped_6", "die.wav" }; 

void AudioClass::playAudio(std::array<std::string, 11> turretDetectionWavFiles, std::array<std::string, 6> turretActivationWavFiles,
std::array<std::string, 4> turretSearchingWavFiles, std::array<std::string, 16> turretPowerDownWavFiles, std::array<std::string, 3> turretAttackWavFiles, std::array<std::string, 11> turretMovedWavFiles,
std::array<std::string, 12> turretDie)
{
//do something
}
void exampleReceiveData()
{
std::thread t(AudioClass::playAudio, (turretDetectionWavFiles, turretActivationWavFiles, turretSearchingWavFiles, turretPowerDownWavFiles, turretAttackWavFiles, turretMovedWavFiles, turretDie));
}
int main()
{
exampleReceiveData();
}

我也尝试了这种方式,并得到了相同的错误:

std::thread t(&AudioClass::playAudio, AudioClass());

this指针需要作为第一个参数传递:

void exampleReceiveData(void)
{
AudioClass ac;    
std::thread t(&AudioClass::playAudio, &ac, turretDetectionWavFiles, 
turretActivationWavFiles, turretSearchingWavFiles, 
turretPowerDownWavFiles, turretAttackWavFiles, 
turretMovedWavFiles, turretDie);
t.join();
}