I also tried this (inside the thread method):

        ETEXT_DESC monitor;
        monitor.cancel = &CMyDocEx::cancel;
        monitor.cancel_this = this;
        api->Recognize(&monitor);

        std::shared_ptr<tesseract::TessPDFRenderer> renderer =
                std::make_shared<tesseract::TessPDFRenderer>(
                CStringA(sSrcFile), api->GetDatapath(), false);

        if (! api->ProcessPages(CStringA(sSrcFile), nullptr, 0, 
renderer.get()))
        {
            break;
        }

and

    // CMyDocEx header:
class CMyDocEx : public CDocument
{
.....
    static bool cancel(void* cancel_this, int words)
    {
        return true;
    }

Stopping *api->ProcessPages* it is a mission impossible ?
On Tuesday, June 21, 2022 at 6:03:04 PM UTC+3 [email protected] wrote:

> Win10, VS2017, MFC C++ application, Tesseract 4.1.1
>
> I started *TessBaseAPI::ProcessPage* call, and I realized I couldn't stop 
> it. I noticed the prototype of *TessBaseAPI::ProcessPages*, if the int 
> timeout_millisec parameter is greater than 0, the library uses internally a 
> *ETEXT_DESC* monitor:
>
> // *from TessBaseAPI source code:*
>
> bool TessBaseAPI::ProcessPage(Pix* pix, int page_index, const char* 
> filename,
>                               const char* retry_config, int 
> timeout_millisec,
>                               TessResultRenderer* renderer) {
> ....
>     PageIterator* it = AnalyseLayout();
>
>     if (it == nullptr) {
>       failed = true;
>     } else {
>       delete it;
>     }
>   } else if (tesseract_->tessedit_pageseg_mode == PSM_OSD_ONLY) {
>     failed = FindLines() != 0;
>   } else if (timeout_millisec > 0) {
>     // Running with a timeout.
>     ETEXT_DESC monitor;
>     monitor.cancel = nullptr;
>     monitor.cancel_this = nullptr;
>     monitor.set_deadline_msecs(timeout_millisec);
>
> as you see, if *timeout_millisec* is greater than 0, some monitor is set 
> up, however, not to stopping the process on demand, but for timout.
>
> My question is: can be stopped *TessBaseAPI::ProcessPages* in a way, 
> maybe using *ETEXT_DESC* ?
>
> I have tried this (*ReadImageThread* is used as multi-thread, not as 
> single thread):
>
> void CMyDocEx::ReadImageThread(const CString& sSrcFile)
> {
>     do
>     {
>         std::shared_ptr<tesseract::TessBaseAPI> api = 
> std::make_shared<tesseract::TessBaseAPI>();
>         if (api->Init(CStringA(GetAppPathTemp()), "eng"))
>         {
>             break;
>         }
>
>         api->Recognize(&m_monitor);
>
>         std::shared_ptr<tesseract::TessPDFRenderer> renderer =
>                 std::make_shared<tesseract::TessPDFRenderer>(
>                 CStringA(GetFileName(sSrcFile)), api->GetDatapath(), 
> false);
>
>         if (! api->ProcessPages(CStringA(sSrcFile), nullptr, 0, 
> renderer.get()))
>         {
>             break;
>         }
>         api->End();
>     } while (FALSE);
> }
>
> where *m_monitor* is defined in my *CMyDocEx* header:
>
> class CMyDocEx : public CDocument
> {
> ....
> protected:
>     static bool cancel(void* cancel_this, int words)
>     {
>         return m_bCancelFlag;
>     }
> ....
> protected:
>     ETEXT_DESC m_monitor;
>     static bool m_bCancelFlag;
> ....
> }
>
> and implementation file (*cpp*):
>
> bool CMyDocEx::m_bCancelFlag = false;
>
> CMyDocEx::CMyDocEx()
> {
>     // TODO: add one-time construction code here
>
>     m_monitor.cancel = &CMyDocEx::cancel;
>     m_monitor.cancel_this = 
> reinterpret_cast<void*>(CMyDocEx::m_bCancelFlag);
> }
>
> and when I put *m_bCancelFlag* to true, seems to happen nothing ...
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"tesseract-ocr" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tesseract-ocr/f55eca62-1276-4211-b2ab-ad02193efccbn%40googlegroups.com.

Reply via email to