| | |
| | | this->eventHandler->Bind(wxEVT_THREAD, &QueueManager::OnThreadMessage, this);
|
| | | this->jobsDir = jobsdir;
|
| | | this->QueueList = std::map<int, QM::QueueItem>();
|
| | | this->LoadJobListFromDir();
|
| | | }
|
| | |
|
| | | QM::QueueManager::~QueueManager()
|
| | | {
|
| | | }
|
| | |
|
| | | int QM::QueueManager::AddItem(QM::QueueItem item)
|
| | | {
|
| | | if (!item.id)
|
| | | if (item.id == 0)
|
| | | {
|
| | | item.id = this->GetCurrentUnixTimestamp();
|
| | | item.id = this->GetAnId();
|
| | | }
|
| | | if (item.created_at == 0)
|
| | | {
|
| | | item.created_at = this->GetCurrentUnixTimestamp();
|
| | | }
|
| | |
|
| | | this->QueueList[item.id] = item;
|
| | |
|
| | | this->SendEventToMainWindow(QM::QueueEvents::ITEM_ADDED, item);
|
| | | if (this->isRunning == false)
|
| | | if (this->isRunning == false && item.status == QM::QueueStatus::PENDING)
|
| | | {
|
| | | this->SendEventToMainWindow(QM::QueueEvents::ITEM_START, item);
|
| | | this->isRunning = true;
|
| | | }
|
| | | this->SaveJobToFile(item);
|
| | | return item.id;
|
| | | }
|
| | |
|
| | |
| | | {
|
| | | QM::QueueItem item;
|
| | | item.params = *params;
|
| | | item.created_at = item.id = this->GetCurrentUnixTimestamp();
|
| | | return this->AddItem(item);
|
| | | }
|
| | |
|
| | |
| | | {
|
| | | QM::QueueItem item;
|
| | | item.params = params;
|
| | | item.created_at = item.id = this->GetCurrentUnixTimestamp();
|
| | | return this->AddItem(item);
|
| | | }
|
| | |
|
| | |
| | | if (this->QueueList.find(id) != this->QueueList.end())
|
| | | {
|
| | | this->QueueList[id].status = status;
|
| | | this->QueueList[id].updated_at = this->GetCurrentUnixTimestamp();
|
| | | if (status == QM::QueueStatus::DONE)
|
| | | {
|
| | | this->QueueList[id].finished_at = this->GetCurrentUnixTimestamp();
|
| | | }
|
| | | this->SaveJobToFile(this->QueueList[id]);
|
| | | this->SendEventToMainWindow(QM::QueueEvents::ITEM_STATUS_CHANGED, this->QueueList[id]);
|
| | | }
|
| | | }
|
| | |
| | | void QM::QueueManager::OnThreadMessage(wxThreadEvent &e)
|
| | | {
|
| | |
|
| | | e.Skip();
|
| | | if (e.GetSkipped() == false)
|
| | | {
|
| | | e.Skip();
|
| | | }
|
| | | auto msg = e.GetString().ToStdString();
|
| | |
|
| | | std::string token = msg.substr(0, msg.find(":"));
|
| | |
| | | {
|
| | | this->SetStatus(QM::QueueStatus::RUNNING, payload.id);
|
| | | this->isRunning = true;
|
| | | return;
|
| | | }
|
| | | if (event == QM::QueueEvents::ITEM_FINISHED)
|
| | | {
|
| | |
| | | break;
|
| | | }
|
| | | }
|
| | | // move finished job into another list - ??
|
| | | return;
|
| | | }
|
| | | }
|
| | |
|
| | |
| | | this->SetStatus(QM::QueueStatus::RUNNING, payload.id);
|
| | | this->isRunning = true;
|
| | | }
|
| | | // nothing to todo here, the payload is the generated image list
|
| | | // nothing to todo here, the payload is the generated image list, we can't find whitch item was it...
|
| | | // TODO: use struct to payload, and store multiple items in it...
|
| | | if (token == "GENERATION_DONE")
|
| | | {
|
| | | }
|
| | | }
|
| | |
|
| | | void QM::QueueManager::SaveJobToFile(int id)
|
| | | {
|
| | | auto item = this->GetItem(id);
|
| | | this->SaveJobToFile(item);
|
| | | }
|
| | |
|
| | | void QM::QueueManager::SaveJobToFile(QM::QueueItem item)
|
| | | {
|
| | | nlohmann::json jsonfile(item);
|
| | | std::string filename = this->jobsDir + "/" + std::to_string(item.id) + ".json";
|
| | | std::ofstream file(filename);
|
| | | file << jsonfile;
|
| | | file.close();
|
| | | }
|
| | |
|
| | | int QM::QueueManager::GetCurrentUnixTimestamp()
|
| | |
| | | return static_cast<int>(std::chrono::duration_cast<std::chrono::seconds>(p1.time_since_epoch()).count());
|
| | | }
|
| | |
|
| | | void QM::QueueManager::LoadJobListFromDir()
|
| | | {
|
| | |
|
| | | if (!std::filesystem::exists(this->jobsDir))
|
| | | {
|
| | | std::filesystem::create_directories(this->jobsDir);
|
| | | }
|
| | |
|
| | | int i = 0;
|
| | | for (auto const &dir_entry : std::filesystem::recursive_directory_iterator(this->jobsDir))
|
| | | {
|
| | | if (!dir_entry.exists() || !dir_entry.is_regular_file() || !dir_entry.path().has_extension())
|
| | | {
|
| | | continue;
|
| | | }
|
| | |
|
| | | std::filesystem::path path = dir_entry.path();
|
| | |
|
| | | std::string ext = path.extension().string();
|
| | |
|
| | | if (ext != ".json")
|
| | | {
|
| | | continue;
|
| | | }
|
| | |
|
| | | std::string name = path.filename().replace_extension("").string();
|
| | |
|
| | | std::ifstream f(path.string());
|
| | | try
|
| | | {
|
| | | nlohmann::json data = nlohmann::json::parse(f);
|
| | | auto item = data.get<QM::QueueItem>();
|
| | | if (item.status == QM::QueueStatus::RUNNING)
|
| | | {
|
| | | item.status = QM::QueueStatus::FAILED;
|
| | | }
|
| | | this->AddItem(item);
|
| | | }
|
| | | catch (const std::exception &e)
|
| | | {
|
| | | std::cerr << e.what() << '\n';
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | int QM::QueueManager::GetAnId()
|
| | | {
|
| | | int id = this->GetCurrentUnixTimestamp();
|
| | | while (id <= this->lastId)
|
| | | {
|
| | | id++;
|
| | | }
|
| | | this->lastId = id;
|
| | | return id;
|
| | | }
|
| | |
|
| | | void QM::QueueManager::onItemAdded(QM::QueueItem item)
|
| | | {
|
| | | // this->parent->m_joblist
|