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

Windows Presentation Foundation Discussion :

Synchroniser des données entre plusieurs instances d'une même application


Sujet :

Windows Presentation Foundation

  1. #1
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut Synchroniser des données entre plusieurs instances d'une même application
    Bonjour,

    je cherche une solution me permettant de synchroniser des données entre plusieurs instances d'une mm application.

    Par exemple, j'ai 2 instances.

    Dans la 1ere, je lance un calcul via un bouton qui peut durer assez longtemps.

    Il faut que dans ma 2e instance, le bouton soit désactivé le temps que la 1e instance est finie ce traitement.

    Comment forcer cette communication ?
    via WCF et les NamedPipe. Ca, c'est ok !

    Dans l'idée, les clients communiquent avec le serveur WCF hébergé via l'application WPF dans le sens client => server.

    Comment notifier chaque instances qu'un traitement est en cours pour désactiver des commandes spécifiques ? est-ce possible ?

    Voir une sorte de Messenger (send/register) avec une portée mutli-instances...

    (Soit ce n'est pas possible et il faut que lors qu'un instance déclenche un traitement, elle interroge le serveur pour savoir si cette commande est possible et renvoi un retour à l'utilisateur dans le cas négatif...)

    Si vous avez des idées...

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Il faut que dans ma 2e instance, le bouton soit désactivé le temps que la 1e instance est finie ce traitement.
    On ne peut jamais assurer une synchro à 100% :

    • à l'instant t, l'instance I1 et l'instance I2 sont activable,
    • à l'instant t+epsilon1, I1 s'active
    • à l'instant t+epsilon2,l'événement d'activation (méthode à définir) est reçu par I2.
    • entre t+epsilon1 et t+epsilon2, I2 reste activable.

    Une instance affichée comme "activable" doit donc systématiquement vérifier au moment où on essaie de l'activer si c'est encore possible.

  3. #3
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par Graffito Voir le message
    On ne peut jamais assurer une synchro à 100% :

    • à l'instant t, l'instance I1 et l'instance I2 sont activable,
    • à l'instant t+epsilon1, I1 s'active
    • à l'instant t+epsilon2,l'événement d'activation (méthode à définir) est reçu par I2.
    • entre t+epsilon1 et t+epsilon2, I2 reste activable.

    Une instance affichée comme "activable" doit donc systématiquement vérifier au moment où on essaie de l'activer si c'est encore possible.
    je suis d'accord avec toi. Il faut vérifier au moment d'un appel si c'est possible de le faire (même si notre interface affiche le contraire).

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Le principal problème réside dans les contraintes suivantes :
    1) possibilité d'obtenir l'indication de blocage si on lance une instance 2 après que l'instance 1 ait activé le blocage,
    2) gestion de de blocage concurrent (instance 1 et 2 testent le blocage au "même" moment)
    3) possibilité de positionner un indicateur de blocage sans que cet indicateur persiste si le programme l'ayant positionné crashe,
    4) "reception" des blocages par event.

    Les points 1) et 2) imposent un mécanisme de gestion d'accès concurrent (via un SGBD par exemple).
    Le point 3) peut se résoudre en horodatant le blocage, en faisant en sorte que le processus actif le réactive régulièrement et qu'un processus candidat ignore les blocages trop anciens.
    Le point 4) peut être contourné via un event Timer qui testerait le blocge.

    Questions subsidiaires :

    • Les instances sont-elles sur le même PC ?
    • Utilisent-elles un SGBD ?

  5. #5
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut
    oui. Je cherche à faire le plus simple possible.
    les instances seront sur le mm pc et l'appli utilise des bases de données sqlite.

    effectivement, je peux gérer cette synchro via une bdd, et mettre en place un listener sur les fonctions utilisables. En fait il faudrait mettre en place un système de push entre un contrôleur commun et les IHM.
    pour ce qui est des blocages, ce nest pas trop le pb, on peut utiliser des events et les exceptions.

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Je cherche à faire le plus simple possible.
    On peut utiliser un fichier "free.txt" que l'on renomme en "lock.txt" et vice-versa.
    Le FileSystemWatcher permet d'être averti des renommages, donc des blocages/déblocages.

  7. #7
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par Graffito Voir le message
    On peut utiliser un fichier "free.txt" que l'on renomme en "lock.txt" et vice-versa.
    Le FileSystemWatcher permet d'être averti des renommages, donc des blocages/déblocages.
    oui en effet... pas bête

    Sinon pour en revenir à un module de synchro entre les instances, le WCF NamedPipe est elle la meilleure solution pour communiquer ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 52
    Points : 63
    Points
    63
    Par défaut
    Bonjour,
    Je m'incruste sur le sujet il y'a peut-être aussi la solution d'utiliser WCF avec MSMQ non ?
    http://msdn.microsoft.com/fr-fr/library/ms789048.aspx

  9. #9
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par sfxzeus Voir le message
    Bonjour,
    Je m'incruste sur le sujet il y'a peut-être aussi la solution d'utiliser WCF avec MSMQ non ?
    http://msdn.microsoft.com/fr-fr/library/ms789048.aspx
    Ah petite précision. je suis limité au .NET 4.0 car je dois garder une compatibilité avec XP SP3.

    Par contre j'ai testé le système du FileSystemWatcher avec une fichier lock.txt ou free.txt ==> ça marche super bien.

    J'ai bindé des DelegateCommand sur mes boutons. L'event "Renamed" du watcher me Raise le CanExecute du DelegateCommand.

    voir pj.

    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
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    public partial class MainWindow : Window, INotifyPropertyChanged
        {
            private FileSystemWatcher _watcher;
            public event PropertyChangedEventHandler PropertyChanged;
     
            private bool _isBusy = false;
            public bool IsBusy
            {
                get { return _isBusy; }
                set
                {
                    _isBusy = value;
                    RaisePropertyChanged("IsBusy");
                }
            }
     
            private DelegateCommand _launchProcessCommand;
            public ICommand LaunchProcessCommand
            {
                get
                {
                    if (_launchProcessCommand == null)
                    {
                        _launchProcessCommand =
                            new DelegateCommand(
                                DoWork,
                                () => File.Exists("free.txt"));
                    }
                    return _launchProcessCommand;
                }
            }
     
            protected void RaisePropertyChanged(string prop)
            {
                if (string.IsNullOrWhiteSpace(prop) != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(prop));
                }
            }
     
            public MainWindow()
            {
                InitializeComponent();
     
                this.DataContext = this;
     
                //Get currentPath
                string path;
                path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
     
                _watcher = new FileSystemWatcher(path);
                _watcher.Path = path;
     
                _watcher.Renamed += (s, e) =>
                {
                    _launchProcessCommand.RaiseCanExecuteChanged();
                };
     
                _watcher.NotifyFilter = NotifyFilters.FileName;
                _watcher.Filter = "*.txt";
                _watcher.EnableRaisingEvents = true;
            }
     
            private void DoWork()
            {
                IsBusy = true;
                LockProcess();
     
                Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(4000);
                    //DO LONG PROCESS
     
                    ReleaseProcess();
                    Dispatcher.BeginInvoke(new Action(() =>
                        {
                            IsBusy = false;
                        }), null);
                });
            }
     
            private void LockProcess()
            {
                if (File.Exists("free.txt"))
                    System.IO.File.Move(@"free.txt", @"lock.txt");
     
                _launchProcessCommand.RaiseCanExecuteChanged();
            }
     
            private void ReleaseProcess()
            {
                if (File.Exists("lock.txt"))
                    System.IO.File.Move(@"lock.txt", @"free.txt");
     
                _launchProcessCommand.RaiseCanExecuteChanged();
            }
        }
    Images attachées Images attachées  

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 52
    Points : 63
    Points
    63
    Par défaut
    MSMQ est dispo sur 4.0 mais de toute façon je me dis que ce sera largement plus complexe qu'un système de fichier.

    Par contre dans le cas où ton appli qui a bloqué plante tu vas faire comment ?
    Il y'a aussi le cas de l'arrêt de windows et fermeture forcé des applications.

  11. #11
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par sfxzeus Voir le message
    MSMQ est dispo sur 4.0 mais de toute façon je me dis que ce sera largement plus complexe qu'un système de fichier.

    Par contre dans le cas où ton appli qui a bloqué plante tu vas faire comment ?
    Il y'a aussi le cas de l'arrêt de windows et fermeture forcé des applications.
    Oui ce sont des choses à gérer. Tester au lancement de la 1ere instance si on a un lock.txt ou un free.txt.
    en fonction, remettre une config par defaut.

    le système de fichier permet de faire un retour utilisateur en temps réel (Commande exécutable ou pas)
    Sinon, développer un canal commun a chaque instance pour appeler le traitement, incluant un mécanisme de sémarphoe (mutex par exemple...).
    Si mon mutex est "Release" et que le système de fichier me dit le contraire... je remet à jour mon système de fichier, ce qui dévérouillera la commande dans l'IHM.

    Qu'en pensez vous ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/06/2015, 15h59
  2. Comment synchroniser des données entre plusieurs applications
    Par DotNET74 dans le forum Windows Phone
    Réponses: 8
    Dernier message: 13/05/2013, 07h23
  3. [Débutant] Partager des javascripts entre plusieurs projets d'une même solution
    Par antrax2013 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 12/12/2012, 10h59
  4. Réponses: 16
    Dernier message: 10/07/2009, 14h27
  5. Réponses: 3
    Dernier message: 14/06/2009, 00h14

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