2011-01-11 4 views
0

J'espère que vous pourrez suivre cela. La question est à la fin.Appeler une DLL de manière asynchrone

J'ai un classeur Excel 2003 qui contient une table de valeurs à utiliser dans DOE (Design of Experiments). Cette feuille charge (via Workbook.Open) un autre classeur et remplit les champs corrects, puis exécute le calcul dans le deuxième classeur (via Application.Run("backend.xla!calc")).

À son tour, le calcul appelle un .dll externe (compilé Fortan) et attend qu'elle se termine (via Declare Sub Calculate Lib "fortran.dll" (args)). Chaque course prend 4 minutes. Il pourrait y avoir 7 à 21 points par DOE. À la fin, les valeurs clés sont retirées dans le premier classeur pour afficher les résultats. S'il vous plaît aidez-moi à penser à un moyen de créer plusieurs copies du deuxième classeur et de les faire calculer (appeler la même DLL, avec différents paramètres) en même temps (processus Excel différent) pour utlitiser un processeur 4-core meilleur.

Ou peut-être un moyen d'appeler directement une fonction externe de manière asynchrone. Je comprends que Excel 2003 VBA est single threaded, et une DLL externe ne peut être utilisée que comme singleton (je ne suis pas sûr).

PS. Sentez-vous libre de dire que je suis plutôt bloqué par les calculs de style séquentiel. C'est bon, je peux le prendre.

Répondre

0

C'est rapide et sale, mais vous devriez avoir l'idée. Le concept est de créer entièrement de nouveaux processus Excel et ouvrez le classeur de chaque nouveau processus:

Sub MakeNewProcess() 
Dim xl As Application 

    Set xl = New Application 
    xl.Visible = True 
    MsgBox "Check task manager and you'll see (at least) two EXCEL.EXE processes" 
End Sub 

J'ai ajouté la boîte de message, car après avoir cliqué sur OK dans la boîte de message, la variable xl est hors de portée et la nouvelle le processus est automatiquement tué. Si vous exécutez votre méthode Workbooks.Open à partir de cette variable (c'est-à-dire, xl.Workbooks.Open), elle devrait vous mener où vous voulez.

+0

Intéressant. Lorsque j'essaie de calculer avec xl.Run, le thread attend jusqu'à ce qu'il se termine avant de pouvoir continuer, et ne peut donc pas exécuter plusieurs calculs en même temps. – ja72

+0

Hmm. Je suis désolé que cela n'a pas fonctionné. Je serais intéressé de voir comment cette question se résout. – mwolfe02

Questions connexes