你知道任何方法(C ++)来创建包含线程函数的对象向量吗?理想情况下,该技术必须是跨平台(Win / OSX)并且易于移植到移动(iOS)。它可以是非常基本的多线程,并行运行的功能非常简单(但计算密集)。
我正在编写一个具有许多对象(属于同一个类)的应用程序,这些对象具有非常复杂的数据结构,需要并行分析:主应用程序线程负责与用户交互并渲染场景, object在不同的线程上并行分析其数据。
到目前为止,我尝试在OpenFrameworks(使用ofThread)中对应用程序进行原型设计,但是一旦我开始创建包含线程函数的对象向量,编译器就会抛出一些奇怪的错误(参见下面的参考资料)。 / em>的
(OpenFrameworks示例)
class MyClass: public ofThread
{
int A, B, C;
void threadedFunction();
MyClass();
}
...如果我实例化该类(运行其方法,包括线程函数)没问题。
然后我创建了这个类的向量:// in main function
...
vector<MyClass> myList;
...但是现在,当我尝试将类的实例添加到向量时,编译器无法说它无法访问类Poco中的privte成员:FastMutex(utils \ ofthread.h(190) ):错误C2248:'Poco :: FastMutex :: FastMutex':无法访问类'Poco :: FastMutex'中声明的私有成员和Poco:Thread(utils \ ofthread.h(190):错误C2248:'Poco :: Thread :: Thread':无法访问类'Poco :: Thread'中声明的私有成员)
// in main function
...
myList.push_back(MyClass()); //ERROR!
// in main function
...
MyClass temp; //OK SO FAR
myList.push_back(temp); //ERROR!
欢迎任何帮助!
答案 0 :(得分:3)
您无法复制互斥锁。您的push_back
函数会尝试在向量中创建MyClass
的新实例,作为temp
的副本。您可以使用智能指针向量。
答案 1 :(得分:1)
在openFrameworks中,我们有一个名为typedef
的{{1}},它会尝试包裹ofPtr
。避免它,因为它很快就会消失。相反,我建议使用std::shared_ptr<>
,这对openFrameworks目前支持的所有平台都可用。例如:
std::shared_ptr<>
当您从向量中删除对象时,// Your .h header file
std::vector<shared_ptr<YourClass> > vectorOfYourClassInstances;
// Your .cpp/.mm implementation file
std::shared_ptr<YourClass> yourClassInstance = std::shared_ptr<YourClass>(new YourClass);
vectorOfYourClassInstances.push_back(yourClassInstance);
// The place where you are using your class
// Iterate through using an index or an iterator
// std::vector<shared_ptr<YourClass> >::iterator ...
for(std::size_t i = 0; i < vectorOfYourClassInstances.size(); ++i)
{
std::shared_ptr<YourClass> onOfYourClassInstances = vectorOfYourClassInstances[i];
onOfYourClassInstances->makeItDoAThing(); // make it do a thing
}
将跟踪引用的数量,并会调用您的类的析构函数(std::shared_ptr
)自动为您释放内存。
目前openFrameworks并不完全支持C ++ 11(它正在积极开发中),但是到时候,您可以使用C ++ 11的YourClass::~YourClass() { }
函数,如果是,则可以使用std::make_shared
更适合您的应用。