Come posso creare un processo in esecuzione su un thread separato in MS Access VBA? Mi piacerebbe creare un processo che siederà e attenderà un messaggio.VBA + Thread in accesso MS
risposta
Buona domanda, ma penso che non si possa fare.
Il modo più rapido che riesco a pensare è creare un modulo e applicare un controllo esistente o fai da te.
Non c'è modo di farlo direttamente in VBA. Here is a MSDN forum discussion parlando di questo in dettaglio. Office non ha mai esposto nessuna delle estensioni VBA per il multithreading.
Tuttavia, è possibile eseguire questa operazione chiamando l'API di Windows o creando il proprio oggetto COM in VBA (scritto altrove) che esegue le chiamate con multithreading per l'utente. Assicurati di eseguire il marshalling di tutto sul thread chiamante, in qualche modo (probabilmente il polling contro il tuo oggetto COM, o qualcosa di simile).
Inoltre, è possibile controllare il collegamento di bendewey sul threading COM, poiché è molto importante per questo.
Se MS Access VBA consente di utilizzare i moduli, rilasciare un timer su un modulo e impostare il ritardo su un valore veramente basso, ad esempio 10 ms. Quindi inserire il codice nella funzione di evento del timer e verrà eseguito in una thread separata.
Che ne dici di utilizzare qualcosa come ShellOpen() per avviare uno script di shell, ad esempio Visual Basic Script x volte, che eseguirà il lavoro, comunicando con lo script tramite un file (e un meccanismo di pooling per rilevare quando arrivano i risultati)? Penso che sia più facile da fare rispetto alla scrittura di un componente COM. Inoltre, VB Script è molto simile a VBA. I lati negativi sono piuttosto numerosi: scrivere e leggere un file richiede più tempo della condivisione della memoria, il pool potrebbe rendere lo script VBA insensibile, ecc.
È inoltre possibile utilizzare la procedura DoEvents che consente al sistema di gestire il problema. eventi. Basta chiamare questo sub di tanto in tanto e il thread principale non si blocca.
Questa non è una buona soluzione, è male, davvero male – Onkelborg
E perché è una soluzione così brutta? Ho usato questo approccio nella mia sceneggiatura e ha funzionato bene. Ho appena chiamato DoEvents a un intervallo di 1000 ms o un secondo. – Ionut
Beh, ha funzionato, ma è tutto. Un'interfaccia che risponde ai messaggi una volta al secondo non risponde. Ed è una cattiva pratica avere un programma che esegue codice solo per il polling. Spingere è meglio far dormire il programma quando non succede niente. Altri programmi traggono vantaggio da questa causa e meno interruttori di contesto si verificano e il consumo di energia diminuisce. Se davvero, devi davvero eseguire il polling, non utilizzare l'approccio di DoEvents, utilizzare almeno un timer, non compromettere la coda dei messaggi e rendere l'applicazione non rispondente – Onkelborg
Si potrebbe voler controllare questa soluzione: http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html
Si tratta di Excel, ma dovrebbe essere praticamente lo stesso. Funziona con la costruzione di "agenti" VBScript e li hanno eseguire compiti .. Verificare l'esempio, è abbastanza impressionante
-Viggo
- 1. Accesso MS: eseguire una query salvata per nome in VBA
- 2. MS Access senza VBA?
- 3. Ereditarietà per codice VBA in MS Access
- 4. Espressioni regolari in MS Access VBA?
- 5. Sostituire il modulo di testo in MS Access utilizzando VBA
- 6. Nhibere e accesso MS
- 7. copia testo formattato in accesso utilizzando vba
- 8. accesso al filtro VBA
- 9. Accesso MS: formato carta personalizzato
- 10. Accesso VBA - Riferimenti file relativi
- 11. Database Accesso SQL in Excel-VBA
- 12. Accesso iniziale da Excel VBA
- 13. Accesso UI in un thread
- 14. Perché il mio VBA per MS Access Buggy?
- 15. Connessione al servizio Web in MS Access con VBA
- 16. Esegui SAS da VBA con accesso completo
- 17. Riattivazione thread per quantità casuale di MS
- 18. Accesso Ms Salva record nella sottomaschera
- 19. Codeigniter utilizzando il database di accesso ms
- 20. Accesso MS: Determinazione del tipo di oggetto
- 21. Converti codice colore accesso MS in esadecimale in C#
- 22. Come incorporare i moduli di accesso ms nel modulo C#?
- 23. MS Word VBA - Determina l'estensione di "style run"?
- 24. VBA: Come eseguire un'altra applicazione da MS Access
- 25. Uscita MS Access Query su Excel con vba
- 26. Codice di sostituzione VBA di MS Access Cifratura/decrittografia
- 27. Accesso alle enumerazioni di parole VBA standard
- 28. MS Excel si blocca quando viene eseguito il codice vba
- 29. Valore autonumber dell'ultima riga inserita - MS Access/VBA
- 30. Valore di ritorno di accesso dalla funzione VBA in .NET?
+1: corretta. È possibile scrivere un componente multithread (o utilizzarne uno esistente) e chiamarlo da VBA, ma VBA non è esso stesso multithread. – Joe