Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建传递指定对象的成员函数的线程?_C++_Multithreading - Fatal编程技术网

C++ 如何创建传递指定对象的成员函数的线程?

C++ 如何创建传递指定对象的成员函数的线程?,c++,multithreading,C++,Multithreading,我一直在寻找有关这个问题的信息,并在互联网上进行研究,但我没有找到任何可以解决我问题的方法 总而言之,我有两个类,第一个类用作摄像机和计算机之间的接口。我们可以称之为,类ccameraainterface。第二类用于处理相机。我们可以称之为类CMultiCam 在类CCameraInterface中,我创建了许多CMultiCam对象作为来自不同传输层(即USB3.0 GigE…)的摄影机,这些对象存储在名为m\u vCamera的std::vector中。 虽然它们是同一类型的对象,但它们在相

我一直在寻找有关这个问题的信息,并在互联网上进行研究,但我没有找到任何可以解决我问题的方法

总而言之,我有两个类,第一个类用作摄像机和计算机之间的接口。我们可以称之为,
类ccameraainterface
。第二类用于处理相机。我们可以称之为
类CMultiCam

在类
CCameraInterface
中,我创建了许多
CMultiCam
对象作为来自不同传输层(即USB3.0 GigE…)的摄影机,这些对象存储在名为
m\u vCamera
std::vector
中。 虽然它们是同一类型的对象,但它们在相同的函数中会做不同的事情。因此,我需要识别在新线程中调用的对象

Class CMultiCamera{
public:
...
SI_32 GetFrames(std::vector<UI_8*>& f_desiredFrame_p);
...
}
通过这种方式,我调用的不是特定对象的函数
GetFrame
,而是类
CGenIMultiCamera
中的通用函数

所以我试着运行这条线路:

l_thCaptureImages[l_index] = std::thread(&CGenIMultiCamera::GetFrames, (this->(m_vCamera.at(l_index)), m_vImage);
但我得到了下一个编译器错误:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\thr/xthread(249): note: see the reference to create function template instances void std::_LaunchPad<_Target>::_Execute<0,1>(std::tuple<SI_32 (__cdecl CGenIMultiCamera::* )(std::vector<UI_8 *,std::allocator<_Ty>> &),CABSCameraControl *> &,std::integer_sequence<unsigned __int64,0,1>)'
1>          with
1>          [
1>              _Target=std::unique_ptr<std::tuple<SI_32 (__cdecl 
CGenIMultiCamera::* )(std::vector<UI_8 *,std::allocator<unsigned char *>> &),CABSCameraControl *>,std::default_delete<std::tuple<SI_32 (__cdecl CGenIMultiCamera::* )(std::vector<UI_8 *,std::allocator<unsigned char *>> &),CABSCameraControl *>>>,
1>              _Ty=UI_8 *
1>          ]
C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\VC\include\thr/xthread(249):注意:请参阅创建函数模板实例void std:_LaunchPad::_Execute(std::tuple&,std::integer_sequence)'
1> 与
1>          [
1> _Target=std::unique_ptr,
1> _Ty=UI_8*
1>          ]
我怎样才能解决它?
提前感谢您

尝试传递静态成员函数的地址加上对象的地址。然后,通过这个函数,您可以调用您首先要调用的成员函数

示例代码:

#include <thread>
#include <iostream>

class MyClass
{
public:
    static void StaticFunc (MyClass *self) { self->MemberFunc (); };
    void MemberFunc () { std::cout << "MemberFunc called\n"; }
};

int main ()
{
    MyClass obj;
    std::thread t (&MyClass::StaticFunc, &obj);
    t.join ();
}
#包括
#包括
类MyClass
{
公众:
静态void StaticFunc(MyClass*self){self->MemberFunc();};

void MemberFunc(){std::cout尝试传递静态成员函数的地址加上对象的地址。然后,从该函数中,您可以调用首先要调用的成员函数

示例代码:

#include <thread>
#include <iostream>

class MyClass
{
public:
    static void StaticFunc (MyClass *self) { self->MemberFunc (); };
    void MemberFunc () { std::cout << "MemberFunc called\n"; }
};

int main ()
{
    MyClass obj;
    std::thread t (&MyClass::StaticFunc, &obj);
    t.join ();
}
#包括
#包括
类MyClass
{
公众:
静态void StaticFunc(MyClass*self){self->MemberFunc();};
void MemberFunc(){std::cout使用lambda:

l_thCaptureImages[l_index] = std::thread([this, l_index] {
    GetFrames(m_vCamera.at(l_index)), m_vImage);
});
使用lambda:

l_thCaptureImages[l_index] = std::thread([this, l_index] {
    GetFrames(m_vCamera.at(l_index)), m_vImage);
});

啊,这更简洁了。感谢rustyx,lambda函数应该是这样的:l_captureImage[l_index]=std::thread([&]{m_vCamera.at(l_index)->GetFrames(m_vImages);});因为GetFrames是存储在m_vCameras vector中的对象的函数,而m_vImages则是args。它几乎可以正常工作,但现在我有一个运行时错误。它可以正常工作,比如5秒,但随后是chrash。例外情况是:静态void _Run(_LaunchPad _Ln)_NOEXCEPT//强制终止{//在_Target _local(_stdforward(_Ln->_MyTarget));_Ln->_Release();_Execute(_local,make_integer_sequence());_Execute中构造本地唯一的_ptr并调用函数对象。啊,这更简洁。感谢rustyx,lambda函数应该是这样的:l_captureImage[l_index]=STD::thread([&]{m_vCamera.at(l_index)->GetFrames(m_vImages);};因为GetFrames是存储在m_vCameras向量中的对象的函数,而m_vImages是参数。它几乎可以正常工作,但现在我有一个运行时错误。它可以正常工作5秒,但随后出现chrash。这里有一个例外:static void_Run(_LaunchPad_Ln)\ u NOEXCEPT//强制终止{//在_Target _local(_stdforward(_Ln->_MyTarget));_Ln->_Release();_Execute(_local,make_integer_sequence());}_Execute中构造本地唯一的_ptr并调用函数对象。这不是错误消息。注意,它说“注意:--这意味着它在解释它之前或之后告诉您的内容。重要的是标记为“错误”的部分:。您所展示的代码中有大量不平衡的括号、未定义的名称和类型不匹配,因此确实不可能猜测到底是什么错了,但如果调用语法正确,您所采取的方法将起作用。这里不需要静态成员函数或lambda。对于此类问题,请从普通funct开始ion调用,而不创建线程。一旦你要编译它(无需运行它),你就知道你需要的所有合适的名称,你可以重写代码从线程调用该函数。因此,例如,
f(3,my_thing)
将变成
std::thread(f,3,my_thing)
或者,如果
f
是成员函数,
std::thread(&my_class::f,3,my_thing)
。我编写的代码是一段代码。我的整个程序大约有3000行。这只是一个示例,以便更好地了解代码。我的整个代码运行得很好,当我尝试启动这些线程时问题已经开始。我的程序中有另一个线程,没有任何问题,因为我不需要识别b在同一类的对象之间。感谢您的访问。显示的错误是:错误C2893:未能专门化函数模板的未知类型std::invoke(_Callable&,_Types&&…)“该错误消息基本上意味着编译器无法理解程序传递给
std::thread
构造函数的参数。除此之外,也不可能说,因为没有足够的信息。这不是错误消息。请注意,它说的是“注意:--这意味着它在解释它之前或之后告诉您的内容。重要的是标记为“错误”的部分:。您所展示的代码中有大量不平衡的括号、未定义的名称和类型不匹配,因此确实不可能猜测到底是什么错了,但如果调用语法正确,您所采取的方法将起作用。这里不需要静态成员函数或lambda。对于此类问题,请从普通funct开始离子呼叫,不创建线程。一旦你有了它