如何将带有参数的方法传递给线程以执行?

How to pass method with arguments to thread to execution?

本文关键字:线程 执行 方法 参数      更新时间:2023-10-16

我有一个方法

void RobocopyCopy::monitoring_thread_method(std::string path_to_monior)
{
while (!m_bMonitorThreadShouldExit)
{
printf("HERE WE ARE!!!! Path is :: %sn", path_to_monior.c_str());
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}

我需要在后台启动它,所以我创建了一个线程,并希望将此方法作为参数传递

void RobocopyCopy::start_monitoring_thread(std::string path_to_monior)
{
m_bMonitorThreadShouldExit = false;
m_pMonitoringThread = std::unique_ptr<std::thread>(new std::thread(&RobocopyCopy::monitoring_thread_method, path_to_monior, this));
}

我收到这样的错误

>RobocopyCopy.cpp
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(238): error C2672: 'std::invoke': no matching overloaded function found
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(246): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Execute<0,1,2>(std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *> &,std::integer_sequence<_Ty,0,1,2>)' being compiled
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>,std::default_delete<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>>>,
1>            _Ty=size_t
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(245): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Execute<0,1,2>(std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *> &,std::integer_sequence<_Ty,0,1,2>)' being compiled
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>,std::default_delete<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>>>,
1>            _Ty=size_t
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(242): note: while compiling class template member function 'void std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *) noexcept'
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>,std::default_delete<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>>>
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(230): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *) noexcept' being compiled
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>,std::default_delete<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>>>
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(257): note: see reference to class template instantiation 'std::_LaunchPad<_Target>' being compiled
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>,std::default_delete<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>>>
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethread(49): note: see reference to function template instantiation 'void std::_Launch<std::unique_ptr<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>,std::default_delete<_Ty>>>(_Thrd_t *,_Target &&)' being compiled
1>        with
1>        [
1>            _Ty=std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>,
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>,std::default_delete<std::tuple<void (__cdecl RobocopyCopy::* )(std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,RobocopyCopy *>>>
1>        ]
1>c:tetavi_main2tv_appstv_world2tv_logic_cpprobocopycopy.cpp(73): note: see reference to function template instantiation 'std::thread::thread<void(__cdecl RobocopyCopy::* )(std::string),std::string&,RobocopyCopy*,void>(_Fn &&,std::string &,RobocopyCopy *&&)' being compiled
1>        with
1>        [
1>            _Fn=void (__cdecl RobocopyCopy::* )(std::string)
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(238): error C2893: Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(238): note: With the following template arguments:
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(238): note: '_Callable=void (__cdecl RobocopyCopy::* )(std::string)'
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includethrxthread(238): note: '_Types={std::basic_string<char,std::char_traits<char>,std::allocator<char>>, RobocopyCopy *}'
1>Done building project "TV_Logic_CPP.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我做错了什么?

m_pMonitoringThread = std::make_unique<std::thread>(&RobocopyCopy::monitoring_thread_method, this, path_to_monior);