IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Créer un service windows avec C++Builder10 [Débutant]


Sujet :

C++Builder

  1. #1
    Membre à l'essai Avatar de KISEKI
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 23
    Points : 23
    Points
    23
    Par défaut Créer un service windows avec C++Builder10
    Bonjour,

    Donc j'utilise l'outil de builder pour créer un service "Service Application".

    Le but de mon service est de transférer les données d'une table vers une autre, j'ai ainsi du rajouter un TDatabase et TQuery dans mon Service Application.

    Voici le code du transfert il marche correctement dans une fiche vcl avec un TTimer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Query1->SQL->Clear();
     Query1->SQL->Add( "INSERT INTO Tab2(Nom1) SELECT Nom from Tab where validation_t = 1");
     Query1->ExecSQL();
     
    //supprime
     
     Query1->SQL->Clear();
     Query1->SQL->Add("Delete FROM Tab where validation_t = 1");
     Query1->ExecSQL() ;
    Mon problème je n'arrive pas à exécuter mon service après son l'installation.

    Test effectuer:

    -Si ma Database est directement connecté dans les propriétés, le service ne veut pas s'exécuter (Message d'erreur le programme à prit trop temps à s'exécuter).

    -Si ma Database n'est pas directement connecté mais je veux la connecter lors du démarrage du service exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TService1::ServiceStart(TService *Sender, bool &Started)
    {
    Database1->Connected=true;
    }
    Problème (Message d'erreur le service à besoin d'autre service ou programme pour fonctionner.

    -Autre Test mais toujours les mêmes problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void __fastcall TService1::ServiceExecute(TService *Sender)
    {
     
    while(!Terminated)
    {
     
    Service1->Database1->Connected=true;
    Service1->Query1->SQL->Clear();
    Service1->Query1->SQL->Add( "INSERT INTO Tab2(Nom1) SELECT Nom from Tab where validation_t = 1");
    Service1->Query1->ExecSQL();
     
    //supprime
     
    Service1->Query1->SQL->Clear();
    Service1->Query1->SQL->Add("Delete FROM Tab where validation_t = 1");
    Service1->Query1->ExecSQL() ;
    Service1->Database1->Connected=false;
    }
    }
    J'ai essayé d'utiliser un Thread en ajoutant un ObjetThread à mon projet mais non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void __fastcall MyThread::Execute()
    {
     
    while(!Terminated)
    {
     
    Service1->Database1->Connected=true;
    Service1->Query1->SQL->Clear();
    Service1->Query1->SQL->Add( "INSERT INTO Tab2(Nom1) SELECT Nom from Tab where validation_t = 1");
    Service1->Query1->ExecSQL();
     
    //supprime
     
    Service1->Query1->SQL->Clear();
    Service1->Query1->SQL->Add("Delete FROM Tab where validation_t = 1");
    Service1->Query1->ExecSQL() ;
    Service1->Database1->Connected=false;
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TService1::ServiceExecute(TService *Sender)
    {
    while(!Terminated)
    {
    ServiceThread->ProcessRequests(true);
    MyThread1->Resume();
    }
    }
    Donc à ce jour je suis un peu perdu j'ai regardé sur internet mais en vain, j'ai utilisé un tutoriel voici le lien http://www.kbcafe.com/articles/TService.pdf j'ai du rater quelque chose mais je n'y arrive pas donc si quelqu'un peu me mettre sur la voie je vous en remercie.

    Cordialement KISEKI.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Je n'ai jamais utilisé le BDE dans un service mais les composants MyDAC, vérifie ton objet Session (unité DBTable)

    As-tu attribué un utilisateur à ton service (voir sc.exe pour le faire en ligne de commande)
    Tu as peut-être besoin d'activer l'interactivité avec le bureau pour accéder au BDE ?
    Quelle version de Delphi ? de Windows ?
    Le niveau de sécurité d'un service W2K est minimal
    XP c'est facile à gérer, affecter un compte utilisateur ouvre plus de possibilité
    Vista\Seven cela peut-être nettement plus capricieux, en 64Bits, je ne sais même si tu peux installer du Service 32 Bits

    Tu n'es pas obligé de mettre ce code ta boucle dans OnExecute !
    Je dirais même que cela doit occuper le processeur inutilement, le tutoriel que tu as indiqué n'indique absolument pas cela !

    D'ailleurs pourquoi une boucle ? tu élimines des lignes d'une table vers une autre table, tu ne risque pas d'avoir de conflit avec d'autres applications ?
    Vu le code, tu lance ta requête SELECT + DELETE en boucle, tu vas dépasser le million de requête par heure, le BDE ne le supportera pas plus de 24h non-stop !
    Un sleep pour lancer la requête toute les minutes serait utile !

    Rien n'empêche de mettre un TTimer dans ton Module Service, celui-ci lancement le traitement 5s après le démarrage du Service, c'est que j'ai fait pour un service qui devait tourner en permanence avec un déclenchement périodique !

    Sinon pourquoi faire un service ? ton programme ne fait qu'une fois la tache ou il doit la faire en permanence !
    Tu peux très bien faire un Exe normal lancé par le planificateur de tache !
    J'ai vu cette pratique très souvent !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre à l'essai Avatar de KISEKI
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 23
    Points : 23
    Points
    23
    Par défaut
    Donc mon service devra tourner sur un WinServ2003 où est ma base donnée(SQL-Server2008), je travail sur mon poste (Seven64bitSP1) avec Embarcadero Rad Studio 2010.

    J'ai déjà essayé d'activer l'interactivité avec le bureau toujours un problème.
    Je vais essayé avec le TTimer dans le service avec un sleep.

    Cordialement KISEKI,

    PS:ShaiLeTroll ton avatar me dis quelque chose c'est qui(quoi) exactement.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    SQL-Server2008 - n'utilise pas le BDE !
    Préfère ADO ou DBExpress (ce dernier en utilisation batch est plus performant)

    ça te fera surement un soucis en moins, vu que le BDE utilise le Driver ODBC, ce qu'ADO fera plus efficacement !

    Ensuite, ton service n'aura pas de requêtes de service, oublie le thread pour le moment
    utilise un TTimer qui déclenche la requête toutes les minutes par exemple
    Sauf, la première fois au boit de 100ms par exemple !
    Tu défini l'interval à 100 et Enabled à true dans le OnStart, tu le repasse à 60000 dans le OnTimer !

    le SELECT \ DELETE, tu appeles ces SQL depuis le OnTimer !



    HS : mon Avatar, montage sur costume de G'Kar un narn de la série Babylon 5 avec la tête de Chaka, un Unas de Stargate SG-1, montage fait sous MSPaint en jouant juste sur le Fuchsia et la transparence , j'avais du temps à perdre en 2004 chez un employeur qui me sous-alimentait en taf !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre à l'essai Avatar de KISEKI
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 23
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Merci ShaiLeTroll tu me sauve la vie .

    Le faite de travailler avec les objets ADO et la technique du TTimer marche beaucoup mieux.

    Voici le code finale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    void __fastcall TService1::ServiceStart(TService *Sender, bool &Started)
    {
    Timer1->Interval=100;
    Timer1->Enabled=true;
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TService1::Timer1Timer(TObject *Sender)
    {
     //ADOConnection1->Connected=true;
     
     ADOQuery1->SQL->Clear();
     ADOQuery1->SQL->Add( "INSERT INTO Tab2(Nom1) SELECT Nom from Tab where validation_t = 1");
     ADOQuery1->ExecSQL();
     
    //supprime
     
     ADOQuery1->SQL->Clear();
     ADOQuery1->SQL->Add("Delete FROM Tab where validation_t = 1");
     ADOQuery1->ExecSQL() ;
     
    // ADOConnection1->Connected=false;
     
     Timer1->Interval=5000;
    }
    //---------------------------------------------------------------------------
    Cordialment KISEKI.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    un petit ?
    Ravi de t'avoir aidé, c'est interressant sur l'utilisation du BDE en service, faudrait se renseigner à ce sujet !

    Sinon, faudrait voir si avec un Trigger dans la Base Oracle, si tu ne pourrais pas avoir se comportement dès la modification du validation_t sans devoir lancer ce traitement en boucle !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/06/2015, 12h34
  2. Comment créer un service Windows en c# avec Delphi2005
    Par fplanglois dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 14/11/2006, 20h30
  3. créer un service windows avec TService
    Par youcef81 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/10/2006, 20h20
  4. [Système]Service windows avec java
    Par stephpr44 dans le forum Général Java
    Réponses: 4
    Dernier message: 24/11/2005, 20h50
  5. [Eclipse] créer un service Windows avec Eclipse
    Par tck-lt dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/09/2005, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo