我有一个名为Image
的类,我希望非成员函数返回Image
。
Image::Image(const char * src);
Image::Image& operator= (const Image& p);
Image requestImg(std::string filename); //not a member function
我这样使用它:
Image p = requestImg("grass.png");
这很好,但是 - 我希望能够requestImg
生成一个线程,将一个图像加载到Image
对象(p)中,同时修改该对象的状态为loading=true
。
换句话说。
Image p = requestImg("grass.png"); //image is loading
std::cout << p.loading << std::endl; //true
//some time passes
std::cout << p.loading << std::endl; //false
p
最初不能将加载设置为true,因为它不会加载并且不会导致合理的命名。我意识到使用成员函数,这将更容易 - 甚至传递指向函数的指针,但有没有办法按照我的布局做到这一点?
答案 0 :(得分:3)
您可以保留Image
,并使用std::async
,这会为您提供std::future<Image>
。您可以决定何时需要结果:
#include <future>
auto p = std::async(std::launch::async, &requestImg,"grass.png"); // load image asynchronously
//some time passes
// do other work
// now we really need the image
auto img = p.get(); // blocking call, requires async call to be done loading image.
答案 1 :(得分:1)
以下是我用来实现此目的的一般代码(我很接近,但我们可以称之为解决)。它使用临时futureImage来处理未来,并使用 copy 构造函数重载来创建新线程并在将来填充this
....这是类型:
class Image {
private:
std::future<Image> * futureImage; //just a temporary for threading
void threadingwork(); //this takes futureimage and sets values of self once it finishes
public:
Image(std::future<Image> p); //this sets loading = true, and sets the future + creates a thread which calls threadingwork above
};
std::future<Image> requestImg(std::string filename);
现在:
Image p = requestImg("grass.png");
正确解析(并正确使用复制构造函数)。