Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    cicli e problema memoria

    Salve ragazzi..
    ho un ciclo infinito che esegue questa funzione:

    codice:
    const SPPHRASE* speech::asr(string rule) {
    
    	CoInitialize(0);
    
    	hr = InitSAPI();
    
            //quà ci andrebbe il codice ma il problema si verifica già così...
    
    	CleanupSAPI();
    
    	CoUninitialize();
    
    	return pParts;
    }
    E queste son le due funzioni che richiama:
    codice:
    HRESULT speech::InitSAPI() {
    
    	hr = S_OK;
    
    	while ( 1 ) {
            // create a recognition engine
            hr = cpEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
            if ( FAILED(hr) ) break;
           
            // create the command recognition context
            hr = cpEngine->CreateRecoContext( &cpRecoCtx );
            if ( FAILED(hr) ) break;
    
    		hr = cpRecoCtx->SetNotifyWin32Event();
    		hEvent = cpRecoCtx->GetNotifyEventHandle();
    
            hr = cpRecoCtx->SetInterest( SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION) );
            if ( FAILED(hr) ) break;
    
            // Load our grammar, which is the compiled form of simple.xml bound into this executable as a
            // user defined ("SRGRAMMAR") resource type.
            hr = cpRecoCtx->CreateGrammar(1, &cpGram);
            if (FAILED(hr) ) break;
    
            // Set rules to active, we are now listening for commands
            hr = cpGram->SetRuleState(NULL, NULL, SPRS_ACTIVE );
            if ( FAILED(hr) ) break;
    
            break;
        }
    
        // if we failed and have a partially setup SAPI, close it all down
        if ( FAILED(hr) ) CleanupSAPI();
    
        return (hr);
    
    
    }
    
    void speech::CleanupSAPI() {
    
        // Release grammar, if loaded
        if ( cpGram ) cpGram.Release();
    
        // Release recognition context, if created
        if ( cpRecoCtx )
        {
            cpRecoCtx->SetNotifySink(NULL);
            cpRecoCtx.Release();
        }
    
        // Release recognition engine instance, if created
    	if ( cpEngine ) cpEngine.Release();
    
    }

    sul main ho un for che esegue asr().. il problema è che a programma aperto.. la memoria continua ad allocare.. allocare... allocare.. che cosa sto sbagliando?

  2. #2
    Linguaggio e SO, cmq se Win CoInitialize va fatto all'inizio dell'applicazione. Anzi ti consiglio oleinitialize

    Spiegati meglio.

  3. #3
    Visual c++, applicazione win32console su Windows XP.

    Sto inizializzando il motore di riconoscimento vocale microsoft.. creavo una classe apposita per gestire lo speech.

  4. #4
    Quindi in un ciclo, sconsigli l'utilizzo del coinitialize / counitialize. Quando dici che và fatto all'inizio dell'applicazione intendi dentro il main? o proprio prima e ultima riga del file cpp principale?

  5. #5
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Io so che inizializzare il sistema COM va fatto una sola volta anzi se cerchi la pagina MSDN cn vincoli da rispettare.
    Poi tra l'altro vedo che ripetutamente ti crei l'interfaccia dell'engine e tutto il resto, io lo vedo un po strano. Sicuro?
    Per gli Spartani e Sparta usa spartan Il mio github

  6. #6
    Rispondo con la mia inesperienza: è la soluzione che ho trovato per ora, poiché la classe speech oltre che inizializzare l'engine e vari, richiama anche il "tts" ovvero il text to speak, penso sia obbligatorio.

    Questa classe speech deve poter essere usata sia all'interno di altre classi, sia all'interno della pagina principale, per questo quando inizializzo la classe speak, inizializza l'engine obbligatoriamente.. l'oggetto poi si distrugge penso alla fine..

    Più che altro non capisco una cosa:
    Quando avvio il programma, il task manager mi segna che sta utilizzando circa 8000 kb. Se abbasso e rialzo la finestra, ne segna 1500 kb... ?? Se poi riabbasso e rialzo ancora, si riresetta a circa 1500.. ???

  7. #7
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Nella mia esperienza so che il bello dell'interfacce (COM) e che fino quando l'ultima istanza non viene rilasciata la memoria non viene scaricata. Nulla vieta che in questo caso la cs sia diversa.

    microsoft
    You need to initialize the COM library on a thread before you call any of the library functions except CoGetMalloc, to get a pointer to the standard allocator, and the memory allocation functions.
    Per gli Spartani e Sparta usa spartan Il mio github

  8. #8
    (NB. la mia è "inesperienza"! appunto perchè sto imparando da qualche mese!)

    Si si ma infatti per ora il Com ce l'ho inizializzato (CoInitialize(NULL) e CoUninitialize() ) all'interno del main, ma non so se ho fatto bene.. oppure dovevo metterlo proprio tra la prima e l'ultima riga del cpp main?

  9. #9
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Qui ti dice dove sarebbe opportuno inserire uellq chiamate, cerca AfxOleInit().

    Qui un'esempio dello speech
    Per gli Spartani e Sparta usa spartan Il mio github

  10. #10
    A dire il vero non ci ho capito nulla del link che mi hai passato.

    Poi in ogni caso, ricordo che sto facendo una semplicissima win32console. Dove l'esempio microsoft mi dice chiaramente che si deve usare così:

    codice:
    #include <windows.h>
    #include <sphelper.h>
    
    #pragma warning (disable:4995)
    #include <iostream>
    
    
    bool done = false;
    
    BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
    
    {
    std::wcout    << "Exiting . . ."  << std::endl;
    
    done = true;
    
    return TRUE;
    
    }
    
    int wmain(int argc, wchar_t  **argv)
    {
        LPWSTR    pwszText;
        HANDLE hEvent;
        HRESULT hr;
        CSpEvent evt;
        SPPHRASE *pParts;
        ISpPhrase *pPhrase;
        ULONGLONG ullEvents;
        CComPtr<ISpRecognizer> cpEngine;
        CComPtr<ISpRecoContext> cpRecoCtx;
        CComPtr<ISpRecoGrammar> cpGram;
    
        if ( argc != 2 )
            std::wcout << "Enter the name of a grammar file to test."  << std::endl;
    
        else
        {
            SetConsoleCtrlHandler(HandlerRoutine, TRUE);
            std::wcout << "Speak phrases in the grammar being tested." << std::endl;
            std::wcout << "Press ctrl/c to quit." << std::endl;
    
    
            CoInitialize(0);
    
            hr = cpEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
            hr = cpEngine->CreateRecoContext(&cpRecoCtx);
    
            hr = cpRecoCtx->SetNotifyWin32Event ();
            hEvent = cpRecoCtx->GetNotifyEventHandle();
            ullEvents = SPFEI (SPEI_RECOGNITION) | SPFEI(SPEI_FALSE_RECOGNITION);
            hr = cpRecoCtx->SetInterest (ullEvents, ullEvents);
    
            hr = cpRecoCtx->CreateGrammar(1, &cpGram);
            hr = cpGram->LoadCmdFromFile(argv[1], SPLO_STATIC);
    
            hr = cpGram->SetRuleState(0, 0, SPRS_ACTIVE);
    
            while ( !done)
                
            while ( evt.GetFrom(cpRecoCtx) == S_OK )
            {
             if ( evt.eEventId == SPEI_FALSE_RECOGNITION )
                    std::wcout << "No Recognition." << std::endl;
    
                else
                {
                pPhrase = evt.RecoResult();
                hr = pPhrase->GetPhrase(&pParts);
    
                hr = pPhrase->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, FALSE, &pwszText, 0);
    
                std::wcout << pwszText << "(" << pParts->Rule.Confidence << ")"  << std::endl;
    
                CoTaskMemFree(pParts);
                CoTaskMemFree(pwszText);
                }
        }
    }
    cpGram. Release();
    cpRecoCtx. Release ();
    cpEngine. Release ();
    
     CoUninitialize();
     system("pause");
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.