50 lines
1.5 KiB
C++
50 lines
1.5 KiB
C++
#include "TaskManager.h"
|
|
|
|
|
|
namespace ZL
|
|
{
|
|
|
|
TaskManager::TaskManager(size_t threadCount) {
|
|
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();
|
|
});
|
|
}
|
|
}
|
|
|
|
void TaskManager::EnqueueBackgroundTask(std::function<void()> task) {
|
|
boost::asio::post(ioContext, task);
|
|
}
|
|
|
|
TaskManager::~TaskManager() {
|
|
workGuard.reset(); // Ðàçðåøàåì ioContext.run() çàâåðøèòüñÿ, êîãäà çàäà÷ íå îñòàíåòñÿ
|
|
ioContext.stop(); // Îïöèîíàëüíî: íåìåäëåííàÿ îñòàíîâêà
|
|
for (auto& t : workers) {
|
|
if (t.joinable()) t.join();
|
|
}
|
|
}
|
|
|
|
void MainThreadHandler::EnqueueMainThreadTask(std::function<void()> task) {
|
|
std::lock_guard<std::mutex> lock(mainThreadMutex);
|
|
mainThreadTasks.push(task);
|
|
}
|
|
|
|
void MainThreadHandler::processMainThreadTasks() {
|
|
std::function<void()> task;
|
|
|
|
// Èçâëåêàåì òîëüêî îäíó çàäà÷ó, ÷òîáû íå áëîêèðîâàòü update íàäîëãî
|
|
{
|
|
std::lock_guard<std::mutex> lock(mainThreadMutex);
|
|
if (!mainThreadTasks.empty()) {
|
|
task = std::move(mainThreadTasks.front());
|
|
mainThreadTasks.pop();
|
|
}
|
|
}
|
|
|
|
if (task) {
|
|
task(); // Çäåñü âûïîëíÿåòñÿ RefreshVBO èëè çàãðóçêà òåêñòóðû
|
|
}
|
|
}
|
|
} |