[C++ Builder] Interruption de processus bloquant

Noren - 17 mars 2015 à 17:43
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 18 mars 2015 à 19:52
Bonjour !

Je travaille sur Windows et sur le logiciel C++ Builder. Je travaille actuellement sur la création d'un logiciel pour mon entreprise, mais j'ai un soucis auquel je ne trouve pas vraiment de solutions. Je m'explique :

J'importe un fichier au format DXF et j'affiche une fenêtre de chargement pendant qu'il importe. Le soucis est le suivant : le processus qui gère cela est bloquant. Ce qui est balo, parce que du coup, impossible de cliquer sur le bouton annuler...

Je sais que je devrais utiliser les Threads, mais au vu de la tête des méthodes que j'aurais à faire dans mes threads, j'aimerais trouver une autre solution ! J'ai vu notamment la fonction ProcessMessages qui rend la main à l'application de base, mais je n'arrive pas à l'utiliser correctement...

Je me demande donc si il y a un moyen simple et sans thread de pouvoir cliquer sur le bouton annuler pour qu'il me change un boolean qui me fait sortir de ma fonction ? Je sais notamment que le ShowModal() permet en cliquant sur un bouton bien paramétré de quiter la fenetre, mais il bloque aussi l'exécution, ce qui n'est donc pas vraiment une solution en soi.

J'ai aussi essayé les threads en créant une nouvelle fenêtre qui exécute un thread dans le but de pouvoir annuler si l'on clique sur le bouton de la fenêtre. Le soucis est que le thread bloque la précédente application, cela signifie que si je clique sur annuler, l'annulation fonctionne, mais si je ne fit rien, il ne se passe rien de plus...



Je vous remercie d'avance !

Ps: Je suis désolé de ne pas pouvoir mettre de code, mais au vu du fait que le logiciel n'est pas libre je n'ai pas l'autorisation de divulguer du code sur internet :/

1 réponse

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
18 mars 2015 à 19:52
Salut,

Pour répondre précisément à ta question, on peut dire que oui, il y a les Timers (avec l'api ::SetTimer) qui peuvent remplacer un Thread, mais ce n'est pas fait pour ça.
(Remplacer dans le sens de lancer un traitement asynchrone non bloquant)

Mais en Win32, ce que tu décris est très simple à implémenter.

Utilises ces Apis :

::CreateEvent()          //pour gérer le flag d'annulation
::CreateThread()        //pour lancer ta fonction asynchrone
::SetEvent()            //pour activer le flag d'annulation


En gros dans la boucle du thread tu testes si un SetEvent à été lancé (résultat d'un ;;WaitForSingleObject() par exemple)

Tu trouveras plein d'exemple pour les paramètres de ces APIs

bye...
0
Rejoignez-nous