2009-10-23 5 views
0

mon application delphi 2009 utilise une DLL qui effectue certaines activités qui peuvent prendre plusieurs secondes. J'aimerais montrer une barre de progression. Malheureusement, l'appel DLL est un appel de blocage & n'a pas de fonction de rappel. Un moyen que j'ai envisagé est d'ajouter un TTimer à mon application. lorsque l'événement de temporisation se déclenche, je regarde l'heure et l'utilise pour calculer la progression% et mettre à jour la barre de progression.besoin d'ajouter une barre de progression pour lorsqu'un appel DLL (bloquant) est occupé

Je l'ai fait, aurais-je des problèmes avec le fait que la VCL n'est pas thread-safe?

merci!

+0

Quelle est votre question exactement? Je ne peux pas dire à partir de la réponse acceptée ... Est-ce "Si je l'ai fait, est-ce que je ..." ou est-ce "je l'ai fait, est-ce que je ...". Dans tous les cas, sans appel de la DLL à partir d'un thread secondaire ou coopération de la DLL, cela ne peut pas être fait, donc je ne sais pas pourquoi vous avez déjà accepté la réponse. Quelle est la question, et quelle est la réponse à cela, et pourquoi? Très curieux. – mghie

Répondre

2

Je ne connais pas grand-chose à Delphi, mais s'il fonctionne sur Windows, vous devrez peut-être le faire.

1) Parce que votre interface utilisateur n'est pas thread-safe, vous devez PostMessage dans le thread d'interface utilisateur pour mettre à jour la barre de progression.

2) Si votre thread d'interface utilisateur est le thread appelant dans la DLL, alors vous ne pomperez pas de messages, vous ne pouvez donc pas mettre à jour votre interface utilisateur. Vous pouvez appeler MsgWaitForMultipleObjectsEx pour continuer à pomper des messages en attente, mais puisque l'attente est dans la DLL, vous n'avez aucun handle à attendre. Est-il possible de déplacer votre appel dans la DLL vers un autre thread? Ensuite, vous pouvez attendre sur cette poignée de thread. De cette façon, votre barre de progression continuera à fonctionner. Je ne connais pas grand-chose à Delphi, mais mes collègues me disent qu'il exécute des appels de fonction basés sur Win32, donc il fonctionne très bien comme un programme Windows sur Windows.

+0

j'ai oublié cette option. Je vous remercie! –

+2

Plus que "très semblable" à un programme Windows sur Windows - c'est un programme Windows natif Win32 (même si elle avait été écrite en VS C++). –

1

Étant donné que la DLL bloque, vous devez l'appeler à partir d'un thread de travail secondaire. Si vous l'appelez dans le thread principal, votre TTimer sera bloquée et donc incapable de mettre à jour l'interface utilisateur.

Questions connexes