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.
71 lines
2.9 KiB
C++
71 lines
2.9 KiB
C++
#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();
|
||
}
|