1

我有一个名为的类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最初不能将 loading 设置为 true,因为它不会加载并且不会导致合理的命名。我意识到使用成员函数会更容易 - 甚至可以将指针传递给函数,但是有什么方法可以做到这一点,正如我所阐述的那样?

4

2 回答 2

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.
于 2013-05-13T06:00:25.267 回答
1

这是我用来实现此目的的通用代码(好吧,我很接近,但我们可以称它为已解决)。它使用临时的futureImage 来处理未来,并使用复制构造函数重载来创建一个新线程并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"); 

正确解析(并正确使用复制构造函数)。

于 2013-05-13T07:31:39.577 回答