FAQ n°21592, publiée le 19/05/2021
Dans quel cas les messages "autodiagnostic des threads ... comportement inattendu" ou "accès aux champs interdit" peuvent s'afficher, et comment adapter le traitement ?

Un thread secondaire ne doit pas intervenir directement sur l'UI d'une application. Il ne doit pas ouvrir une fenêtre ou modifier des champs. En effet, si par exemple un thread supprime une ligne dans un champ table par son indice, et qu'un autre thread a également supprimé une ligne au dessus, tout a été décalé et ce n'est plus la bonne ligne qui est supprimée. Afin d'éliminer ces comportements à risque, le mécanisme de sécurité du WLangage apporte davantage de sécurité à chaque version. Il peut interrompre l'exécution d'une application avec le message suivant : 


L'autodiagnostic des threads a détecté un comportement interne inattendu

Code erreur : 2947


ou : 


L'accès aux champs est interdit dans ce thread.

Utilisez une procédure à exécution dans le thread principal pour manipuler les champs.

Code erreur : 2949


Lorsqu'une application provoque ce retour, même si le traitement a pu être fonctionnel précédemment, il faut déplacer l'exécution du traitement dans le thread principal. Les solutions sont les suivantes : 

  • Placer le traitement dans une nouvelle procédure exécutée par e thread principal, et appelée par le thread secondaire.
    Cette nouvelle procédure peut être : 
  • Placer le traitement dans le code de mise à jour de l'UI de la fenêtre. Ce code sera déclenché par le thread secondaire avec un appel de la fonction DemandeMiseAJourUI.


Recommandation :

A partir de la version 26, un thread secondaire peut être sécurisé. Cette solution est recommandée pour bénéficier d'une détection d'erreurs de programmation dès la compilation.


Cas particulier :

A partir de la version 26, pour une sécurité accrue certaines procédures peuvent être exécutées dans une thread secondaire. Cela permet de sécuriser les traitements appelés. C'est par exemple le cas de la procédure callback appelée par la fonction AutomationEvenement, si l'objet Automation qui rappelle est lui-même dans un thread. Il peut donc être nécessaire de mettre à jour un traitement existant, afin de déporter un code dans le thread principal tel que décrit ci-dessus.


Liens utiles sur le sujet :