You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.4 KiB
120 lines
3.4 KiB
/*
|
|
* @Author: xiewenji 527774126@qq.com
|
|
* @Date: 2025-07-11 11:35:40
|
|
* @LastEditors: xiewenji 527774126@qq.com
|
|
* @LastEditTime: 2025-09-15 10:29:44
|
|
* @FilePath: /BOE_Bounding/AIEngineModule/src/AIMulThreadRunBase.cpp
|
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
|
*/
|
|
#include "AI_Factory.h"
|
|
#include <iostream>
|
|
#include <chrono>
|
|
#include <sys/time.h>
|
|
long getcurTime4444()
|
|
{
|
|
struct timeval tv;
|
|
gettimeofday(&tv, NULL);
|
|
return ((long)tv.tv_sec) * 1000 + ((long)tv.tv_usec) / 1000;
|
|
}
|
|
AIMulThreadRunBase::AIMulThreadRunBase() : m_running_(false), m_processing_count_(0) {}
|
|
|
|
AIMulThreadRunBase::~AIMulThreadRunBase()
|
|
{
|
|
Stop();
|
|
}
|
|
|
|
void AIMulThreadRunBase::Start(int num_threads)
|
|
{
|
|
if (m_running_)
|
|
return;
|
|
m_running_ = true;
|
|
m_detnum = 0;
|
|
// num_threads = 2;
|
|
// 仅启动1个线程
|
|
for (int i = 0; i < num_threads; ++i)
|
|
{
|
|
m_workers_.emplace_back(&AIMulThreadRunBase::ThreadLoop, this);
|
|
}
|
|
}
|
|
|
|
void AIMulThreadRunBase::Stop()
|
|
{
|
|
m_running_ = false;
|
|
m_task_cv_.notify_all();
|
|
for (auto &t : m_workers_)
|
|
{
|
|
if (t.joinable())
|
|
t.join();
|
|
}
|
|
m_workers_.clear();
|
|
}
|
|
|
|
void AIMulThreadRunBase::SubmitTask(std::shared_ptr<AITask> task)
|
|
{
|
|
{
|
|
std::lock_guard<std::mutex> lock(m_task_mutex_);
|
|
m_tasks_.push(task);
|
|
}
|
|
m_processing_count_++;
|
|
m_task_cv_.notify_one();
|
|
}
|
|
|
|
bool AIMulThreadRunBase::PopResult(std::shared_ptr<AITask> &result)
|
|
{
|
|
std::lock_guard<std::mutex> lock(m_result_mutex_);
|
|
if (m_results_.empty())
|
|
return false;
|
|
result = m_results_.front();
|
|
m_results_.pop();
|
|
return true;
|
|
}
|
|
|
|
void AIMulThreadRunBase::ThreadLoop()
|
|
{
|
|
while (m_running_)
|
|
{
|
|
|
|
std::shared_ptr<AITask> task;
|
|
{
|
|
std::unique_lock<std::mutex> lock(m_task_mutex_);
|
|
m_task_cv_.wait(lock, [this]()
|
|
{ return !m_tasks_.empty() || !m_running_; });
|
|
|
|
if (!m_running_ && m_tasks_.empty())
|
|
return;
|
|
|
|
task = std::move(m_tasks_.front());
|
|
m_tasks_.pop();
|
|
}
|
|
if (task->bclass)
|
|
{
|
|
// 执行推理
|
|
if (task->engine)
|
|
{
|
|
// std::lock_guard<std::mutex> lock(m_AI_mutex_);
|
|
// long t1 = getcurTime4444();
|
|
task->cls_label = task->engine->AIClass(task->input, &task->cls_score);
|
|
// long t2 = getcurTime4444();
|
|
// printf("det time %d m_tasks_ size %ld\n", t2 - t1,m_tasks_.size());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 执行推理
|
|
if (task->engine && task->output)
|
|
{
|
|
// std::lock_guard<std::mutex> lock(m_AI_mutex_);
|
|
// long t1 = getcurTime4444();
|
|
task->engine->AIDet(task->input, *task->output);
|
|
// long t2 = getcurTime4444();
|
|
// printf("det time %d m_tasks_ size %ld\n", t2 - t1,m_tasks_.size());
|
|
}
|
|
}
|
|
{
|
|
std::lock_guard<std::mutex> lock(m_result_mutex_);
|
|
m_results_.push(task);
|
|
}
|
|
// m_detnum++;
|
|
m_processing_count_--;
|
|
}
|
|
} |