VBA - Gestione TTS Asincrono

di il
13 risposte

VBA - Gestione TTS Asincrono

Buon giorno a tutti.

Ho un problema con la gestione asincrona del TTS di windows tramite VBA.

Il problema è molto semplice. Nonostante SAPI 5.3 e tutte le guide che ho letto sul metodo non riesco a fare parlare access in modo Asincrono. Il che è scocciante e limitante.

Qualcuno ha affrontato questo problema?

13 Risposte

  • Re: VBA - Gestione TTS Asincrono

    Ciao.puoi Descrivere meglio il problema?
    Sicuramente è una funzione che viene usata molto raramente e non è agevole capire se non aggiungi informazioni.
  • Re: VBA - Gestione TTS Asincrono

    Beh è molto semplice.

    Sto creando una lavagna interattiva per la gestione di eventi a tempo (non entro nello specifico).

    Su tale lavagna ci sono altre subform con l'elenco dei partecipanti. Ed a cadenza di ogni minuto viene aggiornato il contenuto di tale lavagna.

    Volevo che VBA leggesse l'elenco partecipanti della N Subform, ma per non "frizzare" il conteggio volevo utilizzare il TTS in modo asincrono.

    Ho creato una sub di "prova molto scarna" con le sole dichiarazioni ma purtroppo quando questa si attiva ho due casistiche:

    Caso 1
    Public Sub VoiceOver()
    Dim V As SpeechLib.SpVoice
    Dim Words As String
    Set V = New SpVoice '
    
      Words = "MA CHE BELLA GIORNATA VEDIAMO COME FUNZIONA"
      V.Speak Words, SVSFlagsAsync
      
    End Sub
    Facendo così la sub viene chiamata, il conteggio prosegue ma il TTS non riproduce nulla.
    Public Sub VoiceOver()
    Dim V As SpeechLib.SpVoice
    Dim Words As String
    Set V = New SpVoice '
    
      Words = "MA CHE BELLA GIORNATA VEDIAMO COME FUNZIONA"
      V.Speak Words
      
    End Sub
    In questo caso il TTS legge la stringa ma OVVIAMENTE "frizza" qualsiasi procedura in atto.
  • Re: VBA - Gestione TTS Asincrono

    Io l'unica cosa che conosco che frizza è la gazzosa.
    Che intendi per frizzare?
    Che mentre parla viene interrotto il conteggio e quindi se per leggere ci mette due minuti, praticamente il conteggio si sballa?
    Provato con "On timer"?
    E che intendi per modo asincrono?
  • Re: VBA - Gestione TTS Asincrono

    Il motore VBA è single threaded perché abbastanza vecchio. Avrai molte difficoltà (ovvero lascia perdere) se vuoi realizzare qualcosa di funzionale.

    Usa un linguaggio .NET e i thread.
  • Re: VBA - Gestione TTS Asincrono

    oregon ha scritto:


    Il motore VBA è single threaded perché abbastanza vecchio. Avrai molte difficoltà (ovvero lascia perdere) se vuoi realizzare qualcosa di funzionale.

    Usa un linguaggio .NET e i thread.
    In realtà, per me, su access è una funzione che lascia il tempo che trova. Come mettere una macchina del caffè su una punto turbo. È sicuramente utile per excell o per power point. Per un database relazionale è solo un abbellimento che non aggiunge altro che complicazioni, sopratutto se l applicazione deve essere distribuita.
  • Re: VBA - Gestione TTS Asincrono

    Non è questione di Access o Excel, che sono comunque degli applicativi. La faccenda è solo se la funzionalità serve veramente (ad esempio per supporto ad ipovedenti) o è solo una cosa di puro "abbellimento". Per quest'ultimo utilizzo non vale la pena in nessun caso.
  • Re: VBA - Gestione TTS Asincrono

    oregon ha scritto:


    Non è questione di Access o Excel, che sono comunque degli applicativi. La faccenda è solo se la funzionalità serve veramente (ad esempio per supporto ad ipovedenti) o è solo una cosa di puro "abbellimento". Per quest'ultimo utilizzo non vale la pena in nessun caso.
    Beh, dipende.
    Non vuoi leggere un testo o dei controlli su access, quello che di solito serve ad un ipovedente, ma stai facendo una presentazione. Access non è nato per fare presentazioni dinamiche, ma per la gestione di dati ed archiviarli.
    Il pacchetto office ti permette di fare quello che vuoi fare, sempre tramite vba, ma devi usare power point, o meglio una interfaccia con vb.net (o al massimo vb6) e collegarti alle tabelle di access.
  • Re: VBA - Gestione TTS Asincrono

    In realtà, per me, su access è una funzione che lascia il tempo che trova. Come mettere una macchina del caffè su una punto turbo. È sicuramente utile per excell o per power point. Per un database relazionale è solo un abbellimento che non aggiunge altro che complicazioni, sopratutto se l applicazione deve essere distribuita.
    Condivido. Ma questo Database non verrà distribuito e sarà a singolo utente, ovvero sarà posizionato su una macchina utilizzata solo a quello scopo.
    Non è questione di Access o Excel, che sono comunque degli applicativi. La faccenda è solo se la funzionalità serve veramente (ad esempio per supporto ad ipovedenti) o è solo una cosa di puro "abbellimento". Per quest'ultimo utilizzo non vale la pena in nessun caso.
    Verissimo, ma su questo DB sto facendo tutta una serie di prove tra cui la grafica dinamica (non vi dico quanto abbia "ostiato" per creare una funzione stabile che ridimensioni 24 subform in base al ridimensionamento della form principale)

    Comunque ho trovato due escamotagè.

    Dato che ovviamente Access non supporta nativamente il mutithreading ho pensato a componenti con cui il database potesse comunicare sfruttando poi il TTS.

    La prima soluzione (che sto ancora collaudando perchè ha alcuni difetti di lag) è fare in modo che il front End "principale" al momento opportuno chiami una nova istanza di access che si occupa della sola parte del TTS. Così il Front end principale non subisce stop che invece ricadono sul secondo DB che è semplicemente un "VISULIZZATORE ed ESCUTORE" e non va ad incidere sui conteggi del primo. L'unico difetto in questo primo esperimento è la lentezza che a volte il Front End principale ha nell'aggiornare i dati per passarli al secondo, e questo crea un lag "minimo" di 5 secondi.

    La seconda che invece è già operativa e funzionante al 100% è sfruttare una SHELL su Excel e passare ad excel minimizzato il compito di chiamare il TTS, in quanto in excel è possibile sfruttare il flag Async.

    Se può interessare posterò eventualmente il codice (molto "rustico") che ho scritto.

    Per quanto mi riguarda considero risolto. Grazie a chi mi ha dato consigli.
  • Re: VBA - Gestione TTS Asincrono

    Ciao. Infatti ti volevo suggerire di usare due front end, ma poi ho pensato che non fosse ottimale, sopratutto se fatti girare su una singola macchina ed un singolo schermo e per questo ti avevo suggerito di utilizzare anche gli altri strumenti office. Comunque in excel dovresti riuscire a ricreare dei form dove visualizzare il conteggio, che prende la lista dalle tabelle access e far leggere i dati ad access. Se vuoi postare il codice per va bene. Tutto serve per imparare e migliorare, sopratutto in frontiere poco esplorate.
  • Re: VBA - Gestione TTS Asincrono

    Comunque in excel dovresti riuscire a ricreare dei form dove visualizzare il conteggio, che prende la lista dalle tabelle access e far leggere i dati ad access.
    No no tutta la parte gestionale e di visualizzazione rimane sul Front End di Access, ad EXcel ho delegato il "semplice" compito di sfruttare in modo Asincrono il TTS.
    Molto banalmente sull'evento chiamante della Form "Lavagna" di Access viene generato un file TXT con quanto va letto dal TTS. Poi ho effettuato una SHELL su Excel dove la Cartella di lavoro che si apre dapprima importa il file TXT nel foglio lavoro, poi "legge" in modo Asincrono e alla fine si chiude in automatico.
  • Re: VBA - Gestione TTS Asincrono

    Ah ok. Quindi excel può rimanere anche ridotto ad icona.
  • Re: VBA - Gestione TTS Asincrono

    Che io sappia anche Excel è Single-Thread, questo dovrebbe rappresentare pertanto le medesime problematiche di Access.
    Ovviamente aprendo l'istanza di Excel in modo ASincrono da Access, questo può in qualche modo aggirare l'ostacolo, in questo caso non parliamo di MultiThreads ma 2 SingleThread, ma funzionerà tanto quanto lo faceva dal VBA di Access.

    Per renderti conto dovresti provare a far fare ad EXCEL la medesima cosa che volevi fare con Access, ovvero il tentativo di MultiThread, in gestione Asincrona.

    Aggiungo che aprire con Shell ti renderà impossibile gestire l'istanza di Excel, a meno di non recuperarla con GETOBJETC a quel punto invece di lanciarla con SHELL usa sempre GETOBJECT, alla prima che ottieni errore 429 usi CREATEOBJECT ed in questo modo potrai anche da Access gestire l'istanza senza doverla minimizzare ad ICONA, basta non renderla visibile in quanto di DEFAULT è VISIBLE=FALSE.
  • Re: VBA - Gestione TTS Asincrono

    Che io sappia anche Excel è Single-Thread
    Confermo
Devi accedere o registrarti per scrivere nel forum
13 risposte