ScreenTranslator/src/ocr/recognizer.cpp

84 lines
1.9 KiB
C++
Raw Normal View History

2020-02-21 00:45:53 +07:00
#include "recognizer.h"
2020-04-11 17:57:37 +07:00
#include "debug.h"
2020-02-21 00:45:53 +07:00
#include "manager.h"
#include "recognizerworker.h"
#include "settings.h"
#include "task.h"
2020-02-21 00:45:53 +07:00
#include "tesseract.h"
#include <QThread>
2020-03-21 17:03:58 +07:00
Recognizer::Recognizer(Manager &manager, const Settings &settings)
2020-02-21 00:45:53 +07:00
: manager_(manager)
2020-03-21 17:03:58 +07:00
, settings_(settings)
2020-02-21 00:45:53 +07:00
, workerThread_(new QThread(this))
{
auto worker = new RecognizeWorker;
connect(this, &Recognizer::reset, //
worker, &RecognizeWorker::reset);
connect(this, &Recognizer::recognizeImpl, //
2020-02-21 00:45:53 +07:00
worker, &RecognizeWorker::handle);
connect(worker, &RecognizeWorker::finished, //
this, &Recognizer::recognized);
connect(workerThread_, &QThread::finished, //
worker, &QObject::deleteLater);
workerThread_->start();
worker->moveToThread(workerThread_);
}
void Recognizer::recognize(const TaskPtr &task)
{
SOFT_ASSERT(task, return );
SOFT_ASSERT(task->isValid(), return );
if (task->sourceLanguage.isEmpty()) {
task->error = tr("No source language set. Check settings");
manager_.recognized(task);
return;
}
queue_.push_back(task);
if (queue_.size() == 1)
processQueue();
}
void Recognizer::processQueue()
{
if (queue_.empty())
return;
emit recognizeImpl(queue_.front());
}
2020-02-21 00:45:53 +07:00
void Recognizer::recognized(const TaskPtr &task)
{
manager_.recognized(task);
SOFT_ASSERT(!queue_.empty(), return );
if (queue_.front() == task) {
queue_.pop_front();
} else {
LERROR() << "processed not first item in recognition queue";
queue_.clear();
}
processQueue();
2020-02-21 00:45:53 +07:00
}
Recognizer::~Recognizer()
{
workerThread_->quit();
const auto timeoutMs = 2000;
2020-05-01 19:20:21 +07:00
if (!workerThread_->wait(timeoutMs)) {
LTRACE() << "terminating tesseract thread";
2020-02-21 00:45:53 +07:00
workerThread_->terminate();
2020-05-01 19:20:21 +07:00
}
2020-02-21 00:45:53 +07:00
}
2020-03-21 17:03:58 +07:00
void Recognizer::updateSettings()
2020-02-21 00:45:53 +07:00
{
2020-04-11 17:57:37 +07:00
SOFT_ASSERT(!settings_.tessdataPath.isEmpty(), return );
2020-02-21 00:45:53 +07:00
queue_.clear();
2020-03-21 17:03:58 +07:00
emit reset(settings_.tessdataPath);
2020-02-21 00:45:53 +07:00
}