1
0
forked from BRT/arc
arc/main.cpp
slava 504c6629ab Integrate threading and Tesseract OCR functionality
Added a background worker using QThread for device screening and integrated Tesseract OCR for text recognition from images. Refactored project structure, updated CMakeLists for Tesseract support, and adjusted .gitignore for build files.
2025-04-14 13:59:19 +07:00

71 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <QApplication>
#include <QThread>
#include "views/MyWindow.h"
#include <tesseract/baseapi.h>
#include "services/device_screener.h"
void setupWorkerAndThread(QCoreApplication& app) {
auto* thread = new QThread;
auto* deviceScreenerWorker = new DeviceScreener;
// Перемещаем worker в новый поток thread.
// Это значит, что все слоты worker, вызываемые через connect(), теперь будут исполняться в этом фоне-потоке.
deviceScreenerWorker->moveToThread(thread);
// Когда поток запустится, автоматически вызовется worker->start() внутри фонового потока.
QObject::connect(thread, &QThread::started, deviceScreenerWorker, &DeviceScreener::start);
// 🔁 Эти 3 строки делают автоматическую зачистку:
// Когда worker закончит работу (emit finished()), мы:
// - останавливаем поток (thread->quit())
// - удаляем worker (deleteLater)
// - удаляем thread (deleteLater)
// Это защищает от утечек памяти и оставшихся потоков после завершения.
QObject::connect(deviceScreenerWorker, &DeviceScreener::finished, thread, &QThread::quit);
QObject::connect(deviceScreenerWorker, &DeviceScreener::finished, deviceScreenerWorker, &QObject::deleteLater);
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);
// Когда пользователь закрывает приложение (Ctrl+C, exit() и т.п.), мы вызываем worker->stop() — ты сам пишешь, что в этом методе.
//Обычно он просто ставит флаг m_running = false, чтобы остановить бесконечный цикл в start()
QObject::connect(&app, &QCoreApplication::aboutToQuit, [=]() {
deviceScreenerWorker->stop();
});
thread->start();
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// Setup worker and thread
setupWorkerAndThread(app);
// tesseract, tesseract-lang
QImage image("./resources/img.png");
if (image.isNull()) {
qDebug() << "Не удалось загрузить изображение.";
return -1;
}
image = image.convertToFormat(QImage::Format_Grayscale8);
tesseract::TessBaseAPI tess;
if (tess.Init(nullptr, "rus")) {
qDebug() << "Ошибка инициализации Tesseract с русским языком.";
return -1;
}
tess.SetImage(image.bits(), image.width(), image.height(), 1, image.bytesPerLine());
QString result = QString::fromUtf8(tess.GetUTF8Text());
qDebug() << "Распознанный текст:" << result;
MyWindow window;
window.show();
return app.exec();
}