Bonjour,
Je souhaiterais installer un service qui, à l'état démarré, execute un bout de code à l'infini et ne s'arrête que quand on l'arrête manuellement.
Comment je pourrais faire?
Bonjour,
Je souhaiterais installer un service qui, à l'état démarré, execute un bout de code à l'infini et ne s'arrête que quand on l'arrête manuellement.
Comment je pourrais faire?
En quel langage voudrais tu le programmer?
En fait, j'ai déjà créer une solution de type (service Windows) avec C# qui permet de créer un service qui execute dans son OnStart une procédure stockée de SQL Server. Mais elle l'execute uniquement une seule fois et se met à l'état démarré alors que je souhaiterais que même à l'état démarré, cette même procédure s'execute chaque minute par exemple.
Pour ce qui est du langage, en C# ou en C , C ++. Je sais pas lequel conviendrait le mieux..
Il me semble qu'en C#, ca m'arrangerait plus.
voila ma méthode OnStart
protected override void OnStart(string[] args)
{
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandText = "demarrer";
SqlConnection MyConnection = new SqlConnection("server=(local);database=master;Trusted_Connection=yes;");
MyConnection.Open();
sqlCmd.Connection = MyConnection;
sqlCmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(sqlCmd);
DataTable dt = new DataTable("tbl");
da.Fill(dt);
sqlCmd.Dispose();
MyConnection.Close();
// TODO: Add start code here (if required) to start your service.
}
Voila ma méthode OnStop()
Voila ce qu'il y a dans le mainprotected override void OnStop()
{
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandText = "arreter";
SqlConnection MyConnection = new SqlConnection("server=(local);database=master;Trusted_Connection=yes;");
MyConnection.Open();
sqlCmd.Connection = MyConnection;
sqlCmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(sqlCmd);
DataTable dt = new DataTable("tbl");
da.Fill(dt);
sqlCmd.Dispose();
MyConnection.Close();
// TODO: Add tear-down code here (if required) to stop your service.
}
static void Main()
{
// To run more than one service you have to add them here
ServiceBase.Run(new ServiceBase[] { new AO() });
}
Je pense que c'est dans le main qu'il faut écrire une boucle après le "ServiceBase.Run(new ServiceBase[] { new AO() });"
while (le service n'est pas terminé)
{
refaire exactement le même code que celui du OnStart()
}
Je sais pas si c'est une bonne idée ...
Merci d'avance de votre aide
je pense qu'il faudrait faire un while autour de ton servicebase.run :
executer un service = executer le onstart.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 while (le service n'est pas terminé) { ServiceBase.Run(new ServiceBase[] { new AO() }); }
ça ne marche pas. :s
Je pense plutôt que ServiceBase.Run c'est executer le OnStart et se mettre dans un état démarré. Or le service ne fait rien à l'état démarré, donc je pense qu'il n'atteint même pas l'instruction le while
Salut,
je pense que l'idée du while est la bonne
par contre, il faut le mettre dans une méthode à part...
pourquoi ne pas lancer un évènement dans le OnStart et lever un flag 'EnCoursDExecution'
et mettre le while(EnCoursDExecution) dans la méthode déclanchée par l'évènement
dans le OnStop, il faudrait baisser le flag EnCoursDExecution
et le service s'arrêterait...
enfin, il y aurait peut être bien une ptite subtilité du genre attendre que la boucle while, donc la méthode d'exécution se termine avant de quitter le OnStop
ce qui pourrait se faire avec un autre flag et une autre boucle d'attente
...
enfin je sais pas si ça serait très propre...
Dans tous les services windows que je fais, j'ai toujours un thread qui execute le travail.
En gros, si tu mets un while dans ton onstart, ça fonctionnera, mais le service aura du mal à passer à l'état démarré, puisqu'il attend que tout le code présent dans le onstart soit exécuté. Si tu boucles à l'infini, le onstart sera jamais terminé...
Donc, la plupart du temps, je fais un truc du genre :
- Créer une méthode doJob() qui exécutera toute la logique de mon code. C'est dans celle ci que je mets ma boucle while.
- Dans le onstart, créer un thread qui va executer ma méthode dojob.
Comme ça, le service démarre tranquille, et fais ce qu'on lui demande.
Et comme suggéré plus haut, tu te mets un petit flag que tu initialise à true dans le onstart pour indiquer qu'il faut bosser, et que tu passe à false dans le onstop pour indiquer qu'il faut arrêter de bosser.
Tant va la cruche à l'eau qu'à la fin y'a plus d'eau.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager