PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → [WM16] Msg aléatoire erreur application irrécupérable sous Psion Néo WinCE 5.0 Core
[WM16] Msg aléatoire erreur application irrécupérable sous Psion Néo WinCE 5.0 Core
Débuté par ThomasR, 25 avr. 2013 20:12 - 7 réponses
Membre enregistré
38 messages
Posté le 25 avril 2013 - 20:12
Bonjour,

Je rencontre un soucis d'erreur d'application irrécupérable lors de l'utilisation d'une application développée avec WinDev Mobile 16.
Ce problème survient de manière aléatoire. Dans 90% des cas, il se produit durant ou après l'exécution d'une procédure dans une fenêtre en particulier mais de temps en temps, cela se produit sur d'autres écrans de l'application.
Généralement, l'application commence par devenir un peu lente et dans le meilleur des cas, seul l'affichage est impacté (champs superposés d'une fenêtre sur l'autre, ...) mais dans la plupart des autres cas, l'application se fige (genre de freeze de l'écran) et le message suivant apparaît :

"Erreur d'application irrécupérable - L'application MonAppli.exe a effectué une opération illégale et va être arrêtée. Si le problème persiste, contactez le fournisseur du programme.
Programme : MonAppli.exe
Exception : OxC0000005
Adresse : 03FC5068"

Les codes remontés en exception et en adresse sont toujours les mêmes, et cela sur les 10 terminaux Psion Néo mis en service.

J'utilise avec le Psion Néo une imprimante Bluetooth Bixolon SPP-R200. Je précise cela car l'erreur rencontrée ne semble pas se produire si l'imprimante n'est pas utilisée (imprimante hors tension ou procédure d'édition mis en commentaire dans le code).
Pour communiquer avec l'imprimante, je charge sa DLL à l'ouverture de l'application et j'utilise ensuite la fonction "API" pour réaliser toutes les opérations nécessaires à l'édition d'un reçu de paiement.

Exemple d'utilisation :
// Dans le code d'initialisation de l'application
hInst est un entier = ChargeDLL("Bxl.dll")
// Au moment d'imprimer :
// Si la DLL est chargée
SI hInst <> 0 ALORS
// On ouvre le port de communication avec l'imprimante
API("Bxl.dll", "PrinterOpen", "COM8:19200", 350)
// Edition d'une ligne centrée (valeur = 1) et en gras (valeur = 2), taille normale (valeur = 0)
API("Bxl.dll", "PrintText","texte à imprimer",1,2,0)
// Sauter une ligne
API("Bxl.dll", "LineFeed", 1)
FIN
// On ferme le port de communication avec l'imprimante
API("Bxl.dll", "PrinterClose")

J'avoue être assez dépité face à ce dysfonctionnement car pour tout le reste, l'application fonctionne parfaitement.

Quelques informations complémentaires :
- Je suis revenu sur la plupart des procédures et requêtes afin d'alléger au maximum mon programme (l'exécutable pèse 744Ko).
- J'ai mis en place des tableaux associatifs pour limiter les accès aux fichiers de paramètres lorsque ces derniers sont sollicités à chaque enregistrement.
- J'ai mis en place une gestion des exceptions dans toutes les procédures et traitements lourds de mon programme. Cette gestion fonctionne parfaitement si un problème est rencontré dans le programme mais dans le cas du dysfonctionnement que j'évoque ici, la gestion des exceptions n'est pas prise en compte).
- La BDD est de l'hyperfile. L'ensemble des fichiers chargés sur le terminal pèsent en général entre 4Mo et 8Mo. (Ces fichiers proviennent d'une application WinDev dont l'analyse est identique à celle du mobile. Selon certains critères, on ne charge sur le Psion Néo que les données dont on aura besoin afin de limiter la taille des fichiers embarqués)
- Je ne charge pas l'intégralité du Framework WinDev Mobile, j'ai opté pour des fichiers personnalisé et je n'en conserve que 11 qui sont chargés au démarrage de l'application.
- J'ai supprimé le seul et unique Thread que j'avais mis en place et j'ai supprimé la fonction "ThreadPause" que j'utilisais dans certaines fenêtres un peu lourdes et pour lesquelles l'affichage ne se réactualisait pas toujours correctement (champs superposés par exemple). J'utilise à la place "FenRepeint" ou "Temporisation" si cela est vraiment nécessaire.
- Tous les fichiers (exécutable, FIC, NDX et dll de l'imprimante et framework) chargés sur le Psion Néo sont copiés dans le répertoire "\Program Files\MonAppli\". Le poids total ne dépasse pas 20Mo.
- Un reset à chaud ou à froid permet aléatoirement de retrouver une situation normale ou pas. Par exemple, l'application peut très bien fonctionner jusqu'au 50ème enregistrement comme se figer des le premier. Le fait de faire un reset reproduit exactement le même symptôme, ça tiens longtemps ou ça se fige tout de suite).

Pour conclure, j'ai beaucoup fouillé les forums sur la toile et j'ai trouvé beaucoup de pistes (les "race condition" (ou situation de compétition), la notion des 32Mo par processus pour chaque application sous WinCE avec un découpage de 512 blocs de 64ko chacun, manipulation de la mémoire via la DLL "Coredll", ...) mais malgré tout, ce problème persiste.

Si certains d'entre vous ont déjà rencontré une situation similaire, je suis preneur de toutes les pistes à étudier car à ce jour, j'ai un programme qui fonctionne mais je ne peux pas le distribuer à mes utilisateurs tant qu'il n'est pas stable.

Un grand merci par avance pour m'avoir lu et pour vos réponses.

Cordialement.
Posté le 25 avril 2013 - 23:00
Bonjour Thomas

Puisque tu soupçonne l'imprimante, une première chose à faire serait un
projet de test qui ne ferait qu'imprimer (toujours la même choses, des
données figées par code)

Si "par chance" ca plante comme ca, ca te fait un projet de test pour:
1. tester en wm17 et 18
2. envoyer au support si 17 et 18 ne résolvent pas le problème

Si ca ne plante pas... Il va falloir chercher ailleur et ca te fait un
point de départ aussi

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com/index_FR.html

On 4/25/2013 1:16 PM, ThomasR wrote:
Bonjour,

Je rencontre un soucis d'erreur d'application irrécupérable lors de l'utilisation d'une application développée avec WinDev Mobile 16.
Ce problème survient de manière aléatoire. Dans 90% des cas, il se produit durant ou après l'exécution d'une procédure dans une fenêtre en particulier mais de temps en temps, cela se produit sur d'autres écrans de l'application.
Généralement, l'application commence par devenir un peu lente et dans le meilleur des cas, seul l'affichage est impacté (champs superposés d'une fenêtre sur l'autre, ...) mais dans la plupart des autres cas, l'application se fige (genre de freeze de l'écran) et le message suivant apparaît :

"Erreur d'application irrécupérable - L'application MonAppli.exe a effectué une opération illégale et va être arrêtée. Si le problème persiste, contactez le fournisseur du programme.
Programme : MonAppli.exe
Exception : OxC0000005
Adresse : 03FC5068"

Les codes remontés en exception et en adresse sont toujours les mêmes, et cela sur les 10 terminaux Psion Néo mis en service.

J'utilise avec le Psion Néo une imprimante Bluetooth Bixolon SPP-R200. Je précise cela car l'erreur rencontrée ne semble pas se produire si l'imprimante n'est pas utilisée (imprimante hors tension ou procédure d'édition mis en commentaire dans le code).
Pour communiquer avec l'imprimante, je charge sa DLL à l'ouverture de l'application et j'utilise ensuite la fonction "API" pour réaliser toutes les opérations nécessaires à l'édition d'un reçu de paiement.

Exemple d'utilisation :
// Dans le code d'initialisation de l'application
hInst est un entier = ChargeDLL("Bxl.dll")
// Au moment d'imprimer :
// Si la DLL est chargée
SI hInst <> 0 ALORS
// On ouvre le port de communication avec l'imprimante
API("Bxl.dll", "PrinterOpen", "COM8:19200", 350)
// Edition d'une ligne centrée (valeur = 1) et en gras (valeur = 2), taille normale (valeur = 0)
API("Bxl.dll", "PrintText","texte à imprimer",1,2,0)
// Sauter une ligne
API("Bxl.dll", "LineFeed", 1)
FIN
// On ferme le port de communication avec l'imprimante
API("Bxl.dll", "PrinterClose")

J'avoue être assez dépité face à ce dysfonctionnement car pour tout le reste, l'application fonctionne parfaitement.

Quelques informations complémentaires :
- Je suis revenu sur la plupart des procédures et requêtes afin d'alléger au maximum mon programme (l'exécutable pèse 744Ko).
- J'ai mis en place des tableaux associatifs pour limiter les accès aux fichiers de paramètres lorsque ces derniers sont sollicités à chaque enregistrement.
- J'ai mis en place une gestion des exceptions dans toutes les procédures et traitements lourds de mon programme. Cette gestion fonctionne parfaitement si un problème est rencontré dans le programme mais dans le cas du dysfonctionnement que j'évoque ici, la gestion des exceptions n'est pas prise en compte).
- La BDD est de l'hyperfile. L'ensemble des fichiers chargés sur le terminal pèsent en général entre 4Mo et 8Mo. (Ces fichiers proviennent d'une application WinDev dont l'analyse est identique à celle du mobile. Selon certains critères, on ne charge sur le Psion Néo que les données dont on aura besoin afin de limiter la taille des fichiers embarqués)
- Je ne charge pas l'intégralité du Framework WinDev Mobile, j'ai opté pour des fichiers personnalisé et je n'en conserve que 11 qui sont chargés au démarrage de l'application.
- J'ai supprimé le seul et unique Thread que j'avais mis en place et j'ai supprimé la fonction "ThreadPause" que j'utilisais dans certaines fenêtres un peu lourdes et pour lesquelles l'affichage ne se réactualisait pas toujours correctement (champs superposés par exemple). J'utilise à la place "FenRepeint" ou "Temporisation" si cela est vraiment nécessaire.
- Tous les fichiers (exécutable, FIC, NDX et dll de l'imprimante et framework) chargés sur le Psion Néo sont copiés dans le répertoire "\Program Files\MonAppli\". Le poids total ne dépasse pas 20Mo.
- Un reset à chaud ou à froid permet aléatoirement de retrouver une situation normale ou pas. Par exemple, l'application peut très bien fonctionner jusqu'au 50ème enregistrement comme se figer des le premier. Le fait de faire un reset reproduit exactement le même symptôme, ça tiens longtemps ou ça se fige tout de suite).

Pour conclure, j'ai beaucoup fouillé les forums sur la toile et j'ai trouvé beaucoup de pistes (les "race condition" (ou situation de compétition), la notion des 32Mo par processus pour chaque application sous WinCE avec un découpage de 512 blocs de 64ko chacun, manipulation de la mémoire via la DLL "Coredll", ...) mais malgré tout, ce problème persiste.

Si certains d'entre vous ont déjà rencontré une situation similaire, je suis preneur de toutes les pistes à étudier car à ce jour, j'ai un programme qui fonctionne mais je ne peux pas le distribuer à mes utilisateurs tant qu'il n'est pas stable.

Un grand merci par avance pour m'avoir lu et pour vos réponses.

Cordialement.
Membre enregistré
38 messages
Posté le 26 avril 2013 - 13:13
Fabrice Harari a écrit dans le message de news <51797ccc$1@news.pcsoft.fr> :
Bonjour Thomas

Puisque tu soupçonne l'imprimante, une première chose à faire serait un
projet de test qui ne ferait qu'imprimer (toujours la même choses, des
données figées par code)

Si "par chance" ca plante comme ca, ca te fait un projet de test pour:
1. tester en wm17 et 18
2. envoyer au support si 17 et 18 ne résolvent pas le problème

Si ca ne plante pas... Il va falloir chercher ailleur et ca te fait un
point de départ aussi

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com/index_FR.html

Bonjour Fabrice,

Merci pour cette réponse rapide.

C'est effectivement une piste que je vais suivre. J'ai déjà testé l'inverse, à savoir utiliser mon application sans charger la DLL de l'imprimante et donc sans utiliser cette dernière et dans ce cas, je n'ai à ce jour pas rencontré le dysfonctionnement que j'évoque.

Il est vrai que ce problème se produit toujours après avoir utilisé au moins une fois l'imprimante mais ce qui est étrange, c'est que cela peut survenir n'importe quand, à savoir pendant ou après l'édition mais également avant même de faire appel à l'imprimante.

Pour prendre l'exemple qui revient dans plus de 90% des cas, j'ai une fenêtre dans laquelle je renseigne divers informations concernant une vente. Au moment de valider, une première procédure locale enregistre ces données dans 3 fichiers :
1 - création d'une facture (1 enregistrement dans le fichier FACTURE),
2 - création d'un ou plusieurs détail(s) associé(s) à cette facture (N enregistrement(s) dans le fichier DETFACT),
3 - création du règlement (1 enregistrement dans le fichier REGLEMENT).
Ensuite, une seconde procédure locale est exécutée pour l'édition (cette procédure fait appel à 2 procédures globales pour l'édition de l'en-tête et du pied de page du ticket).
Problème : le soucis que je rencontre peut ici survenir aussi bien avant, pendant ou après l'édition du reçu mais cela se produit parfois également après l'enregistrement dans l'un des 3 fichiers, donc avant même de faire appel à l'imprimante. Cela donne vraiment l'impression que le code en cours d'exécution est soudainement ignoré surtout qu'il faudra fermer/rouvrir l'application pour retrouver un fonctionnement normal.

Bref, je vais déjà suivre cette piste autour de l'imprimante. Pour WM18, j'espère bien pouvoir y passer bientôt.

Cordialement
Posté le 26 avril 2013 - 16:44
Bonjour Thomas

Question bête : as tu vérifié qu'il n'y a pas une DLL imprimante corrigé
disponible chez ton fournisseur (ou qu'ils ne connaissent pas le
problème, en tout cas) ?

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com/index_FR.html


On 4/26/2013 6:23 AM, ThomasR wrote:
Fabrice Harari a écrit dans le message de news <51797ccc$1@news.pcsoft.fr> :
Bonjour Thomas

Puisque tu soupçonne l'imprimante, une première chose à faire serait un
projet de test qui ne ferait qu'imprimer (toujours la même choses, des
données figées par code)

Si "par chance" ca plante comme ca, ca te fait un projet de test pour:
1. tester en wm17 et 18
2. envoyer au support si 17 et 18 ne résolvent pas le problème

Si ca ne plante pas... Il va falloir chercher ailleur et ca te fait un
point de départ aussi

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com/index_FR.html

Bonjour Fabrice,


Merci pour cette réponse rapide.

C'est effectivement une piste que je vais suivre. J'ai déjà testé l'inverse, à savoir utiliser mon application sans charger la DLL de l'imprimante et donc sans utiliser cette dernière et dans ce cas, je n'ai à ce jour pas rencontré le dysfonctionnement que j'évoque.

Il est vrai que ce problème se produit toujours après avoir utilisé au moins une fois l'imprimante mais ce qui est étrange, c'est que cela peut survenir n'importe quand, à savoir pendant ou après l'édition mais également avant même de faire appel à l'imprimante.

Pour prendre l'exemple qui revient dans plus de 90% des cas, j'ai une fenêtre dans laquelle je renseigne divers informations concernant une vente. Au moment de valider, une première procédure locale enregistre ces données dans 3 fichiers :
1 - création d'une facture (1 enregistrement dans le fichier FACTURE),
2 - création d'un ou plusieurs détail(s) associé(s) à cette facture (N enregistrement(s) dans le fichier DETFACT),
3 - création du règlement (1 enregistrement dans le fichier REGLEMENT).
Ensuite, une seconde procédure locale est exécutée pour l'édition (cette procédure fait appel à 2 procédures globales pour l'édition de l'en-tête et du pied de page du ticket).
Problème : le soucis que je rencontre peut ici survenir aussi bien avant, pendant ou après l'édition du reçu mais cela se produit parfois également après l'enregistrement dans l'un des 3 fichiers, donc avant même de faire appel à l'imprimante. Cela donne vraiment l'impression que le code en cours d'exécution est soudainement ignoré surtout qu'il faudra fermer/rouvrir l'application pour retrouver un fonctionnement normal.

Bref, je vais déjà suivre cette piste autour de l'imprimante. Pour WM18, j'espère bien pouvoir y passer bientôt.

Cordialement
Membre enregistré
394 messages
Popularité : +12 (12 votes)
Posté le 30 avril 2013 - 05:49
Bonjour, j'ai développé un composant fonctionnel pour la SPP-200. Il est téléchargeable sur le site de dépôt en mode démo.

A+, Michel.
Membre enregistré
38 messages
Posté le 02 mai 2013 - 19:01
Bonjour Fabrice,

Merci pour le tuyau, c'est bête, mais je n'ai pas vérifié cela depuis septembre dernier !
Ma DLL est en version 1.1.4.2 (412ko) et le dernier SDK disponible sur le site du constructeur propose une DLL pour WinCE 5.0 en version 1.1.7.4 (178ko).
Téléchargé et testé, je n'ai pour le moment pas rencontré de problème mais je dois approfondir les tests avec les utilisateurs. Plus petite en taille, la DLL est chargée plus rapidement et l'édition est impeccable.

Du côté de mon fournisseur, ce problème n'est pas connu car il ne développe pas avec WinDev Mobile.

Je continue mes tests et reviendrai poster ici les résultats, positifs ou négatifs.

Encore merci.

Cordialement

ThomasR
Fabrice Harari a écrit dans le message de news <517a74f5$1@news.pcsoft.fr> :
Bonjour Thomas

Question bête : as tu vérifié qu'il n'y a pas une DLL imprimante corrigé
disponible chez ton fournisseur (ou qu'ils ne connaissent pas le
problème, en tout cas) ?

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com/index_FR.html

Membre enregistré
38 messages
Posté le 02 mai 2013 - 19:05
Bonjour Michel,

Merci pour l'info. J'avais trouvé le lien du dépôt que j'ai conservé dans mes favoris il y a un peu moins d'un an mais ayant abouti au résultat que j'attendais, je ne me suis pas penché sur la question.
A tester aujourd'hui, cela peut être une solution de contournement ...

Cordialement

ThomasR

Michel GARCIA a écrit dans le message de news <2efd7f10b0a7e4a93e087bab3bed0680@news.pcsoft> :
Bonjour, j'ai développé un composant fonctionnel pour la SPP-200. Il est téléchargeable sur le site de dépôt en mode démo.

A+, Michel.
Membre enregistré
38 messages
Posté le 07 juin 2013 - 12:09
Bonjour,

Un grand merci à Fabrice, le problème est vraisemblablement résolu depuis le changement de la DLL qui pilote l'imprimante.
Le changement est assez significatif car après 4 semaines de tests :
- nous n'avons rencontré aucun plantage,
- il n'y a jamais eu besoin de réaliser un reset du terminal mobile,
- l'appareil et l'application embarquée répondent parfaitement en permancence sans que l'on remarque de ralentissements,
- ... et surtout, aucun message d'erreur n'est réapparu !

Nous sommes repassés en production depuis le 1er juin et tout se passe toujours bien.

Merci.

Cordialement

ThomasR