PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 26 → Service Windows non fonctionnel après un démarrage de Windows.
Service Windows non fonctionnel après un démarrage de Windows.
Débuté par McQUE, 06 avr. 2021 18:30 - 15 réponses
Posté le 06 avril 2021 - 18:30
Bonjour à tous.

Personne ne me trouve de solution alors j’espère que tous ensemble nous trouverons quelque chose.
- J’ai développé un service Windows qui boucle toutes les 60min.
- A côté de cela j’ai un EXE lancé au démarrage de Windows.
- L’un et l’autre se connectent sur une base C/S HFSQL
1) Lors de l’installation de l’ensemble via l’installation standard de Windev (26), les deux se mettent bien en route et fonctionnent parfaitement.
2) Lorsque je REDEMARRE Windows, en cliquant sur REDEMARRER, tout fonctionne à merveille.
3) Enfin lorsque j’arrêt Windows, que j’attends quelques minutes, je démarre le système là seul EXE fonctionne mais plus le service. Ce dernier est pourtant présent dans le gestionnaire de tâche. Si je ne laisse ainsi, après les 60min de sa boucle, il fonctionne.
4) Après un arrêt / démarrage de l’OS le service ne fonctionne pas sauf après le temps de sa boucle, mais si je le stop et le relance il fonctionne.
La seule solution trouvée pour le moment est de retirer l’option de Windows 10 « Démarrage rapide ». Plus de problème mais certaines machines doublent leur temps de démarrage et ceci n’est pas souhaitable à moyen long therme.
Que dois-je ?
1) Laisser ainsi ?
2) Faire une boucle plus petite et faire appel à un thead de 60min ? (Dommage c’est un service !)
3) Une tâche au seul démarrage de l’OS qui relance le service ?
Merci pour votre temps.
Posté le 06 avril 2021 - 22:22
on dirait que lors du premier tour (au démarrage du service), il manque quelque chose pour que "ca fonctionne" dans le cas du démarrage de windows uniquement...
Donc, il est possible que ton service essaye de fonctionner et tombe en erreur au premier tour parce que :
- Le service HFSQL n'est pas encore opérationnel
- l'utilisateur n'est pas encore logué
- etc...

Comme je ne sais pas ce que fait ton service exactement, et de quelles ressource il a besoin, je ne peux pas lister autre chose
Pour vérifier, tu peux loguer les cas d'erreur/exceptions dans un fichier texte et avoir ainsi plus de précisions sur ce qui manque.

Ensuite, un moyen potentiel de résoudre le problème serait de mettre un délai lors du premier démarrage (genre 10 mn) et une fois le premier tour fait de passer à 60....
Un autre serait, une fois la ressource manquante identifiée grace au log, d'ATTENDRE qu'elle devienne disponible en interceptant l'erreur et en faisant une attente d'une minute avant de réessayer
Posté le 06 avril 2021 - 22:39
Bonjour,

Je pense que le serveur HFSQL n'est pas encore joignable au moment du démarrage de ton service.

Il me semble que l'on peut paramétrer l'ordre de démarrage des services. Sinon tu peux mettre une 'tempo' avant la 1ère action du service pour t'assurer que tout soit bien démarré sur le poste.


Fred
Posté le 07 avril 2021 - 09:18
Dans les propriétés du service mettre "automatique (début différé)" dans
type de démarrage.

Mais le fond de la question est de comprendre l'origine du soucis.

La solution la plus simple étant de logué dans un fichier ce que le
service fait en stockant les dates/heures des événements. Avec un peu de
temps on finit par comprendre le soucis ;)

eric l.

> Le 06/04/2021 à 20:39, Fred a écrit :
Bonjour,

Je pense que le serveur HFSQL n'est pas encore joignable au moment du
démarrage de ton service.

Il me semble que l'on peut paramétrer l'ordre de démarrage des services.
Sinon tu peux mettre une 'tempo' avant la 1ère action du service pour
t'assurer que tout soit bien démarré sur le poste.


Fred
Posté le 07 avril 2021 - 09:34
Bonjour et merci pour vos réponses et vos questions.

Le serveur HFSQL est bien en ligne. Il gère à ce jour plusieurs centaines de machines.
C'est aussi pour cette raison que je suis un peut stressé, car toutes les machines ont le même comportement.

Mon service à pour objectif de de monter des informations locales vers le serveur.
Procédure lorsque ça fonctionne :
1) Lancement du service.
2) Dans l'initialisation il teste la présence d'internet et "tantque" Internet n'est pas il boucle avec une servicetemporise(5s)
3) Il passe à la connexion au service avec un contrôle de connexion avec houvreconnexion().
4) il passe à la boucle.

Mettre des log, oui, mais ce que je n'ai pas noté dans le message d'origine, c'est dans le cas ou rien ne se passe :
1) Lancement du service.
2) Il est bien présent dans le gestionnaire de tâche
3) C'est tout.
Même avec une demande d'écriture dans un fichier texte en local à la toute première ligne de l'initialisation et de la boucle principale, rien à faire. RIEN.

Hier soir j'ai essayé de réduire la boucle à 5mini avec un thread de 60min avec un démarrage différé de 10s.
Et bien !
RIEN, la boucle fonctionne comme d'écrit dans le message d'origine dans ce forum, il me remonte bien la date et l'heure de la dernière dans la base sur le serveur mais le thread de 60min se lancera pas avant 60min après le démarrage.
---------------------------------------------------------
Cependant, je rappel que lorsque le service est dans cette état, je l'arrêt et le redémarre, tout fonctionne.
La solution ne serait-il pas, faute d'autre chose, d'arrêter le service à la détection d'arrêt de Windows avant que ce dernier soit arrêté ?
Je préférerais une autre solution. Merci
Membre enregistré
2 234 messages
Posté le 07 avril 2021 - 09:45
Tu peux tout simplement différer le démarrage de ton service car comme Fred, je pense que le service HF n'est pas lancé

https://www.malekal.com/comment-retarder-le-demarrage-dun-service-windows/

--
Cordialement,

Philippe SAINT-BERTIN
Posté le 07 avril 2021 - 09:49
Bonjour et merci pour vos réponses et vos questions.

Le serveur HFSQL est bien en ligne. Il gère à ce jour plusieurs centaines de machines.
C'est aussi pour cette raison que je suis un peut stressé, car toutes les machines ont le même comportement.

Mon service à pour objectif de de monter des informations locales vers le serveur.
Procédure lorsque ça fonctionne :
1) Lancement du service.
2) Dans l'initialisation il teste la présence d'internet et "tantque" Internet n'est pas il boucle avec une servicetemporise(5s)
3) Il passe à la connexion au service avec un contrôle de connexion avec houvreconnexion().
4) il passe à la boucle.

Mettre des log, oui, mais ce que je n'ai pas noté dans le message d'origine, c'est dans le cas ou rien ne se passe :
1) Lancement du service.
2) Il est bien présent dans le gestionnaire de tâche
3) C'est tout.
Même avec une demande d'écriture dans un fichier texte en local à la toute première ligne de l'initialisation et de la boucle principale, rien à faire. RIEN.

Hier soir j'ai essayé de réduire la boucle à 5mini avec un thread de 60min avec un démarrage différé de 10s.
Et bien !
RIEN, la boucle fonctionne comme d'écrit dans le message d'origine dans ce forum, il me remonte bien la date et l'heure de la dernière dans la base sur le serveur mais le thread de 60min se lancera pas avant 60min après le démarrage.
---------------------------------------------------------
Cependant, je rappel que lorsque le service est dans cette état, je l'arrêt et le redémarre, tout fonctionne.
La solution ne serait-il pas, faute d'autre chose, d'arrêter le service à la détection d'arrêt de Windows avant que ce dernier soit arrêté ?
Je préférerais une autre solution. Merci
Posté le 07 avril 2021 - 09:52
J'ai déjà essayé, mais le problème est le même.
Du moment qu'il y a un arrêt du système ça ne fonctionne pas. Un redémarrage oui.
Une solution pour détecter l'arrêt de Windows afin de le faire patienter le temps de fermer le service ?

Merci
Posté le 07 avril 2021 - 17:08
Cela fait trois semaines bientôt que je cherche une solution.
Je comprends que vous ne puissiez pas en trouver une de suite.

Mais je ne dois pas être le seul à avoir eu ce problème. A moins que tout le monde réalise des services à boucle courte et pas de 60min comme moi.

La connexion au serveur est ok, elle est visible sur le serveur directement.
Je cible petit à petit le problème. Et je reviens toujours sur la même chose. Le problème est seulement lorsque le service est en route au moment de l'arrêt de l'OS.
Si j'arrêt le service et j'arrêt la machine puis la rallume après 2 ou 3 minutes de pause, ça fonctionne.
J'ai cherché une solution pour fermer le service sous détection de la fermeture de l'OS, mais je ne trouve rien qui fonctionne. Le système stop trop vite ou ce que je fais ne fonctionne pas.

Mon service à une boucle de 60min car le temps d'exécution varie entre 40sec pour les machines rapides et 3min pour les plus lentes. Imaginer si la boucle devait être de 5min !

Merci
Posté le 07 avril 2021 - 17:50
> Mon service à une boucle de 60min car le temps d'exécution varie entre 40sec pour les machines rapides et 3min pour les plus lentes. Imaginer si la boucle devait être de 5min !

Ce n'est pas parce que le service a une boucle de 5 mn qu'il faut obligatoirement faire le traitement toutes les 5 minutes...

Boucle de 5 mn pour contourner le problème décrit
Compteur dans la boucle
Quand le compteur est à 12, traitement, reset du compteur

Ou n'importe quelle autre combinaison
Membre enregistré
2 234 messages
Posté le 07 avril 2021 - 17:51
Ne peux-tu pas trace ton service ligne à ligne afin de savoir où cela s'arrête et essayer de comprendre pourquoi il s'arrête ?

--
Cordialement,

Philippe SAINT-BERTIN
Posté le 07 avril 2021 - 21:32
Je retiens l'idée du compteur.
Mais il y a une chose IMPORTANTE que vous n'avez pas compris il me semble, sans vouloir vous fâcher. Car je sais que vous essayez de m'aider.

Après un arrêt du système puis un démarrage, (je rallume l'ordinateur), le service se trouve dans le gestionnaire de tâche mais ne fait rien. Même si je veux lui faire écrire dans un fichier texte n'importe quoi, rien n'est écrit.
Rien il ne se passe rien.
Sauf : 1) Après l'attente du temps de la boucle principale.
2) Si je stoppe et relance le service
3) Si je clique sur redémarrer Windows 10.
Voilà.
C'est comme si seul le temps de la boucle est enregistrer lorsque le système est arrêté. Et la reprise, il lance le service et le temps de boucle à zéro.

Argus tu as parlé que tu as aussi un service de 60min.
Peux-tu regarder si il y a un changement de comportement entre un arrêt de Windows et un redémarrage en t'assurant que l'option "Démarrage rapide" est activée bien entendu ?

En attendant, je suis bloqué.
J'attends vos propositions.
Je me suis même demandé si je n'ai pas un problème de le compilateur de Windev.
Nous en serons plus après les testes d'Argus.

Merci
Posté le 07 avril 2021 - 23:42
23h35
J'ai retenu l'idée du compteur.
Cela me permet d'avoir une vue de la disponibilité de mon service avec une boucle touts les 5 min et une date et une heure noté dans la base de donnée avec la valeur de la variable du compteur.
Cela n'apporte pas la solution définitive qui est de lancer la totalité du code au premier lancement que ce soit avec un arrêt de la machine ou un redémarrer.
C'est bien ce que le pensais et plus que cela :
1) Le temps de la boucle est prise en compte et à partir de 0. Soit il faut attendre 5min pour que la boucle principale soit exécutée une première fois.
2) Mais pour la variable du compteur, elle était à 8 lorsque j'ai stoppé la machine avec arrêt du système. 30min plus tard, démarrage de Windows, attendre 5min pour la première boucle, et le compteur passe à 9.

Je vais me coucher.
Posté le 08 avril 2021 - 09:46
McQUE avait soumis l'idée :
Bonjour à tous.

Personne ne me trouve de solution alors j’espère que tous ensemble nous
trouverons quelque chose.
- J’ai développé un service Windows qui boucle toutes les 60min.
- A côté de cela j’ai un EXE lancé au démarrage de Windows.
- L’un et l’autre se connectent sur une base C/S HFSQL
1) Lors de l’installation de l’ensemble via l’installation standard de Windev
(26), les deux se mettent bien en route et fonctionnent parfaitement.
2) Lorsque je REDEMARRE Windows, en cliquant sur REDEMARRER, tout fonctionne
à merveille.
3) Enfin lorsque j’arrêt Windows, que j’attends quelques minutes, je démarre
le système là seul EXE fonctionne mais plus le service. Ce dernier est
pourtant présent dans le gestionnaire de tâche. Si je ne laisse ainsi, après
les 60min de sa boucle, il fonctionne.
4) Après un arrêt / démarrage de l’OS le service ne fonctionne pas sauf après
le temps de sa boucle, mais si je le stop et le relance il fonctionne.
La seule solution trouvée pour le moment est de retirer l’option de Windows
10 « Démarrage rapide ». Plus de problème mais certaines machines doublent
leur temps de démarrage et ceci n’est pas souhaitable à moyen long therme.
Que dois-je ?
1) Laisser ainsi ?
2) Faire une boucle plus petite et faire appel à un thead de 60min ? (Dommage
c’est un service !)
3) Une tâche au seul démarrage de l’OS qui relance le service ?
Merci pour votre temps.


bonjour,

peut on voir le code qui se trouve dans la section :
Exécution du service de XXXXXX (appelé en boucle)

--
Cordialement JeAn-PhI
Posté le 08 avril 2021 - 18:04
Bonjour à tous.

Le code dans Exécution de service peut être mon code ou juste une ligne qui écrit dans un fichier texte le résultat sera le même qu'expliqué ci-dessus.
J'ai réalisé mes essais sur 18 machines.
Toutes avec Windows 10 Home ou Pro avec des niveaux de mise à jour différent.

Le cœur de l'histoire est l'option de Windows 10 "Démarrage rapide" dans les propriétés, active par défaut.

Cas 1 : Si cette option est désactivée, tout fonctionne à merveille mais les machines sont plus longues au démarrage et certains services ou connectivité type Wifi sont disponible quelques seconde ou dizaine de seconde après l'arrivée du bureau, à comparer si l'option est activée.

Cas 2: L'option est activée, alors il faut comprendre ce que fait Windows dans ce cas :
- Lorsque l'utilisateur clique sur arrêter, Windows ferme les programmes en cours et mémorise l'état du reste. Soit les services et toutes les valeurs des variables en mémoire. Tout est écrit dans le fichier caché «hiberfil.sys ».
Résultat, quand le système démarre (Et non redémarre, ce n'est pas la même chose) Windows se charge en lisant ce fichier uniquement au lieu de charger tous les services. Ce qui va effectivement plus vite. Mais cela peut apporter des désagréments usage et de service comme j'ai pu le constater depuis 3 semaines que je travaille sur le sujet.
D'où importance de faire un redémarrage de temps en temps avec de remettre tout à zéro et de terminer également certaines mises à jour système au fil de l'eau sans attendre la demande fatidique de Windows 10.

Pour illustrer les propos, tout service à une boucle principale avec un TemporiseService de X seconde ou minutes.
Plus le temps indiqué pour la boucle est cours moins vous serez sujet à ce problème.
Pour une boucle de 60min, Windows gardera ce temps et au prochain démarrage il chargera le service SANS lire l'initialisation et attendra 60min pour lire une première fois la boucle. La connexion au serveur se fait bien sans lire l'initialisation du service, juste par la monté des informations mémorisé par Windows au moment de l'arrêt.
Grace à Argus, merci au passage, j'ai mis en place un compteur. Une simple variable de type entier qui reçoit plus 1 à chaque boucle de 5min. Quand il la variable est égale à 12 (5x12=60min) alors il lance ma partie prévue pour chaque heure. Ici c'est intéressant, car la valeur de cette variable compteur n'est pas repris à 0. Si Compteur = 8 au moment de l'arrêt de Windows, au démarrage la valeur est gardée. A la prochaine boucle lu 5min après ce démarrage, le compteur passe à 9.

C'est un fait des constats fait sur 3 semaines sur 18 machines différentes.

Je termine en écrivant ceci, merci pour l'idée du compteur, cela m'a donnée une solution de contournement qui fonctionne comme décrit juste au-dessus. Cela me va faute d'une autre solution. J'ai réactivé l'option Démarrage rapide de Windows.

J'ai pris le temps d'écrire ceci car cet article pourrait aider d'autres personnes.
Je sais que certains ne me croiront pas, faites vos testes.
Merci encore.
McQue
Membre enregistré
274 messages
Posté le 08 avril 2021 - 21:55
Bonjour,

Pour débugger mes programmes et surtout les services que je codes, j’utilise l’excellent outils : DebugView de Microsoft : https://docs.microsoft.com/en-us/sysinternals/downloads/debugview

Et pour envoyer des informations à ce programme depuis mes services, j’utilise l’API win32 : OutputDebugString

Cela me permet de tracer en temps réel les traitements contenu dans mes services.

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -