Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Candidat au titre de Membre du Club
    Profil pro Mur Mikael
    Inscrit en
    avril 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Nom : Mur Mikael

    Informations forums :
    Inscription : avril 2010
    Messages : 133
    Points : 10
    Points
    10

    Par défaut Un Problème réseau Qui me bloque :(

    Bonjour à tous,

    Si vous n'avez pas rencontrer ce genre de problème, merci de faire un petit test qui ne demande pas beaucoup du temps:

    Pour cela il nous faut deux postes: un "client" et un "serveur" :

    Environnement : Delphi / Paradox

    1- Exécuter cette procédure delphi à partir du client : (Table1 est située dans le serveur)
    Code :
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.OpenCloseClick(Sender: TObject);
    begin
    Table1.open ;
    ShowMessage('o');
    Table1.close ;
    ShowMessage('c');
    end;
    2- Ouvrir la table (Table1) à partir du serveur.

    3- A partir du poste client couper puis rétablir le réseau.

    4- Re-exécuter la procédure TForm1.OpenCloseClick à partir du client.


    ==> L'interface client se plante

    SVP J'aimerais bien avoir des solutions techniques, et non pas des conseilles genre il faut passer à un vrai SGBD client/serveur, ....

  2. #2
    Expert Confirmé Sénior
    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 4 903
    Points : 6 984
    Points
    6 984

    Par défaut

    Salut je risque de dire des aneries mais les bases de données Paradox ce sont des fichiers .db donc les exploiter en mode client-serveur ça me parait difficile.
    1 sous Delphi les exceptions ça se gère me semble-t-il donc il faudrait mettre une gestion d'exception pour voir les erreurs et éviter le plantage.
    2 si la BDD est mise sur un serveur il faut s'assurer des droits en admnistration côté serveur , lecture de fichier, écriture etc...

    Ceci dit concernant Paradox je doute fortement qu'on puisse mettre les fichiers sur un serveur sans problèmes.

    Citation Envoyé par sniperpro Voir le message
    SVP J'aimerais bien avoir des solutions techniques, et non pas des conseilles genre il faut passer à un vrai SGBD client/serveur, ....
    désolé mais tu te réponds à toi-même
    avec Paradox ça me parait difficile ou alors chercher un composant tout fait pour Delphi une sorte d'unité payante...

  3. #3
    Expert Confirmé Sénior
    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 4 903
    Points : 6 984
    Points
    6 984

    Par défaut

    Citation Envoyé par sniperpro Voir le message
    1- Exécuter cette procédure delphi à partir du client : (Table1 est située dans le serveur)

    2- Ouvrir la table (Table1) à partir du serveur.

    3- A partir du poste client couper puis rétablir le réseau.

    4- Re-exécuter la procédure TForm1.OpenCloseClick à partir du client.


    ==> L'interface client se plante
    Il ne faut pas du tout procéder comme cela.Lorsque tu cliques sur la TForm le code s'exécute normalement mais les échanges réseaux ne sont pas terminés.
    Donc la solution c'est de placer la procédure d'ouverture dans un TThread et voir si la base de donnée est bien fermée.
    Il faut s'assurer des codes de retour et mettre des gestions d'exceptions.
    Mais faire ce genre de chose avec Paradox n'est pas exempts de problèmes...


    "Windows n'a pas pu sauvegarder toutes les données pour le fichier : \\nomServeur\....\....\PDOXUSERS.LCK. Les données ont été perdues"
    je crois que c'est parfaitement clair : lorsqu'on veut ouvrir une table le BDE crée un fichier temporaire certainement un fichier tampon qui est censé être sur le poste client.
    Donc le problème doit venir des droits sur le serveur d'écriture de fichiers ou bien alors le fichier .lck ne retrouve pas les références du ou des fichiers .bd correspondant(s) étant donné que les 2 fichier n'ont pas les mêmes emplacement physiques..

  4. #4
    Candidat au titre de Membre du Club
    Profil pro Mur Mikael
    Inscrit en
    avril 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Nom : Mur Mikael

    Informations forums :
    Inscription : avril 2010
    Messages : 133
    Points : 10
    Points
    10

    Par défaut re

    Merci bien Mat.M , pour votre réponse c'était très utile.


    Et ben ce que j'ai constaté est que l'interface client se bloque pendant un moment (environ 4 ou 5 minutes), puis l'exécution se poursuit (les ShowMessage apparaissent ).

    Donc ce que j'ai fait est de mettre la procédure OpenClose() dans un TThread, voici le comportement de l'interface lors de l'exécution de la procédure (4 éme étape du message précédent).

    1- Les ShowMessage apparaissent normalement, pas de blocage de l'interface.

    2- Mais lorsque je quitte l'interface, elle se plante pendant un moment (les 5min qui étaient dans la première procédure) puis elle se ferme.

    Voici le code de la thread :
    Code :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    unit UnitThreadTable;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, DB, DBTables;
     
    type
      ThreadTable = class(TThread)
      private
        { Déclarations privées }
        Table1 : TTable ;
        procedure OnTerminateProcedure(Sender : TObject);
      protected
        procedure Execute; override;
      public
      //tester si le thread est terminé
      ThreadTerminated : BOOLEAN;
     
      constructor CREATE(ATable1 : TTable);
     
      end;
     
    implementation
     
    constructor ThreadTable.CREATE(ATable1 : TTable);
    begin
     
    FreeOnTerminate := True;
    inherited CREATE(False);
    Table1 :=ATable1;
    OnTerminate := OnTerminateProcedure;
    ThreadTerminated:=False ;
    end;
     
     
    procedure ThreadTable.Execute;
    begin
      { Placez le code du thread ici }
      Table1.close();
      ShowMessage('c');
      Table1.open();
      ShowMessage('o');
     
    end;
     
    procedure ThreadTable.OnTerminateProcedure(Sender: TObject);
    begin
    ThreadTerminated:=True;
    end;
     
    end.
    Le problème est que lors du blocage de l'interface la valeur de la variable ThreadTerminated est True .!!!!!!!

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •