#include "ofxThreadedImageLoader.h"
#include <sstream>
ofxThreadedImageLoader::ofxThreadedImageLoader(){
nextID = 0;
ofAddListener(ofEvents().update, this, &ofxThreadedImageLoader::update);
ofAddListener(ofURLResponseEvent(),this,&ofxThreadedImageLoader::urlResponse);
startThread();
lastUpdate = 0;
}
ofxThreadedImageLoader::~ofxThreadedImageLoader(){
images_to_load_from_disk.close();
images_to_update.close();
waitForThread(true);
ofRemoveListener(ofEvents().update, this, &ofxThreadedImageLoader::update);
ofRemoveListener(ofURLResponseEvent(),this,&ofxThreadedImageLoader::urlResponse);
}
void ofxThreadedImageLoader::loadFromDisk(ofImage& image, string filename) {
nextID++;
ofImageLoaderEntry entry(image);
entry.filename = filename;
entry.image->setUseTexture(false);
entry.name = filename;
images_to_load_from_disk.send(entry);
}
void ofxThreadedImageLoader::loadFromURL(ofImage& image, string url) {
nextID++;
ofImageLoaderEntry entry(image);
entry.url = url;
entry.image->setUseTexture(false);
entry.name = "image" + ofToString(nextID);
images_async_loading[entry.name] = entry;
ofLoadURLAsync(entry.url, entry.name);
}
void ofxThreadedImageLoader::threadedFunction() {
setThreadName("ofxThreadedImageLoader " + ofToString(thread.get_id()));
ofImageLoaderEntry entry;
while( images_to_load_from_disk.receive(entry) ) {
if(entry.image->load(entry.filename) ) {
images_to_update.send(entry);
}else{
ofLogError("ofxThreadedImageLoader") << "couldn't load file: \"" << entry.filename << "\"";
}
}
ofLogVerbose("ofxThreadedImageLoader") << "finishing thread on closed queue";
}
void ofxThreadedImageLoader::urlResponse(ofHttpResponse & response) {
entry_iterator it = images_async_loading.find(response.request.name);
if(response.status == 200) {
if(it != images_async_loading.end()) {
it->second.image->load(response.data);
images_to_update.send(it->second);
}
}else{
ofLogError("ofxThreadedImageLoader") << "couldn't load url, response status: " << response.status;
ofRemoveURLRequest(response.request.getId());
}
if(it != images_async_loading.end()) {
images_async_loading.erase(it);
}
}
void ofxThreadedImageLoader::update(ofEventArgs & a){
ofImageLoaderEntry entry;
if (images_to_update.tryReceive(entry)) {
entry.image->setUseTexture(true);
entry.image->update();
}
}
Comments