Files
shadow-over-bishkek001/src/utils/TaskManager.cpp
T

68 lines
1.9 KiB
C++

#include "TaskManager.h"
namespace FRG
{
TaskManager::TaskManager(size_t threadCount) {
#ifndef __EMSCRIPTEN__
workGuard = std::make_unique<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>>(ioContext.get_executor());
for (size_t i = 0; i < threadCount; ++i) {
workers.emplace_back([this]() {
ioContext.run();
});
}
#endif
}
void TaskManager::EnqueueBackgroundTask(std::function<void()> task) {
#ifdef __EMSCRIPTEN__
task();
#else
boost::asio::post(ioContext, task);
#endif
}
TaskManager::~TaskManager() {
#ifndef __EMSCRIPTEN__
workGuard.reset(); // Разрешаем ioContext.run() завершиться, когда задач не останется
ioContext.stop(); // Опционально: немедленная остановка
for (auto& t : workers) {
if (t.joinable()) t.join();
}
#endif
}
void MainThreadHandler::EnqueueMainThreadTask(std::function<void()> task) {
#ifndef __EMSCRIPTEN__
std::lock_guard<std::mutex> lock(mainThreadMutex);
#endif
mainThreadTasks.push(task);
}
void MainThreadHandler::processMainThreadTasks() {
std::function<void()> task;
#ifdef __EMSCRIPTEN__
if (!mainThreadTasks.empty()) {
task = std::move(mainThreadTasks.front());
mainThreadTasks.pop();
}
#else
// Извлекаем только одну задачу, чтобы не блокировать update надолго
{
std::lock_guard<std::mutex> lock(mainThreadMutex);
if (!mainThreadTasks.empty()) {
task = std::move(mainThreadTasks.front());
mainThreadTasks.pop();
}
}
#endif
if (task) {
task(); // Здесь выполняется RefreshVBO или загрузка текстуры
}
}
}