2009-04-10 20 views

risposta

3

Buona domanda, ma penso che non si possa fare.

+2

+1: corretta. È possibile scrivere un componente multithread (o utilizzarne uno esistente) e chiamarlo da VBA, ma VBA non è esso stesso multithread. – Joe

0

Il modo più rapido che riesco a pensare è creare un modulo e applicare un controllo esistente o fai da te.

4

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.

-1

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.

+5

I timer nei moduli in VBA si verificano sul thread principale. Il modulo utilizza i messaggi di Windows per pianificare, non un thread separato. –

+0

Reed, sono abbastanza sicuro che questo è vero per VB6. È diverso per VBA? – andrewrk

+0

No, è eseguito sullo stesso thread – Onkelborg

1

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.

-1

È 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.

+4

Questa non è una buona soluzione, è male, davvero male – Onkelborg

+0

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

+0

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