68 lines
1.9 KiB
C++
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 или загрузка текстуры
|
|
}
|
|
}
|
|
} |