|
dialoguer entre 2 applications |
Débuté par sebastien.bonnet, 30 jan. 2006 16:50 - 7 réponses |
| |
| | | |
|
| |
Posté le 30 janvier 2006 - 16:50 |
Bonjour,
Je souhaite dialoguer entre 2 applications windev installé sur le même pc. Quel est la meilleur méthode a utiliser. (J'ai pensé a une zone memoire partagée (j'ai vu ca dans une LST) mais peut être y a t'il mieux que cela ???)
Merci de vos suggestions. |
| |
| |
| | | |
|
| | |
| |
Posté le 30 janvier 2006 - 23:27 |
Bonjour, Ca dépend. Est qu'il y a un dialogue entre les deux application ? Est-ce qu'il y a beaucoup d'informations à échanger ? Est-ce que les informations échangées ne sont que des signaux, ou ces informations sont-elles structurées ? Est-ce qu'une des applications peut-être déplacée sur un autre poste ? Est-ce que les deux application supporte le fait que l'autre soit arrêtée ?
Frédéric. |
| |
| |
| | | |
|
| | |
| |
Posté le 01 février 2006 - 14:41 |
L'informations entre les 2 applis est minime et les 2 applis ne seront jamais en reseau. En fait, une des applis envoi une informations (une variable chaine) et l'autre appli doit lire cette information sans retourner de reponse. |
| |
| |
| | | |
|
| | |
| |
Posté le 01 février 2006 - 15:18 |
Sébastien a écrit :
L'informations entre les 2 applis est minime et les 2 applis ne seront jamais en reseau. En fait, une des applis envoi une informations (une variable chaine) et l'autre appli doit lire cette information sans retourner de reponse.
à mon avis, un simple fichier.ini devrait suffire. un petit timer dans l'appli qui doit lire pour mettre à jour.
-- Jacques Trepp Albygest - 81160 - St Juery jacques-pas de spam.trepp@free.fr (enlever '-pas de spam' pour me joindre) http://www.albygest.com |
| |
| |
| | | |
|
| | |
| |
Posté le 01 février 2006 - 16:43 |
jackt81 a écrit :
Sébastien a écrit : L'informations entre les 2 applis est minime et les 2 applis ne seront jamais en reseau. En fait, une des applis envoi une informations (une variable chaine) et l'autre appli doit lire cette information sans retourner de reponse.
à mon avis, un simple fichier.ini devrait suffire. un petit timer dans l'appli qui doit lire pour mettre à jour. un fichier ini permettrait de stocker le handle des 2 applications. (ou 0 pour dire que l'application est fermé) ensuite si le temps presque réel est requis utilise les messages windows (appelé évènements entre autre) Ca permet de synchroniser les applications sans problèmes et quasiment en temps réel.
A++ Goof
PS : c'est de la théorie pure car je n'ai pas essayé entre 2 applications différentes. Par contre moi ça marche très bien entre un thread de travail et la fenêtre de application |
| |
| |
| | | |
|
| | |
| |
Posté le 02 février 2006 - 09:40 |
J'ai déjà utilisé ce système et il n'y a aucun problème PA est le premier programme PB est le second programme
1° Méthode pour signaler l'évenement //********** Dans Initialisation de PA et PB :Demander à Windows un numéro unique de message
WM_NumMessage est un entier WM_Message est une chaîne ASCIIZ sur 128 = "" NumEvenement est un entier = 0
WM_Message = "ICI METTRE UNE PHRASE UNIQUE MAX 127 CHAR" WM_NumMessage = AppelDLL32,"USER32.DLL","RegisterWindowMessageA",&WM_Message) Evénement(<procedure>, "*.*", WM_NumMessage) // Tester que WM_NumMessage>0
//********** Dans la fin du projet IF NumEvenement>0 THEN FinEvénement(NumEvenement)
// Entête de la procédure PROCEDURE <procedure>(pNumMessage, pwParam, pwLParam) ........
2° PA veut envoyer un signal à PB SendMessage(SysFenHandle(<Titre fenêtre B>), WM_NumMessage, wParam, wLParam) wParam, wLParam sont deux entiers libres....
MAINTENANT POUR PASSER UNE CHAINE, IL Y A : 1° Le fichier INI, TEXTE, HYPERFILE.... 2° Le file mapping un chouia plus complexe à mettre en oeuvre mais plus performant. Le principe c'est de reserver un zone du disque pour émuler une zone mémoire partagée 1/2 et en lecture 1/2 en écriture. L'avantage c'est qu'une fois l'information lue elle est automatiquement supprimée.
METHODE POUR CREER UN FILE MAPPING lpFileName est une chaine asciiz sur 32 = <Nom d'un fichier unique>
// CREATION DU FICHIER PHYSIQUE hFile est un entier = AppelDLL32("KERNEL32","CreateFileA",&lpFileName,0xC0000000,0x00000003,0x0,0x04,0x04000002,0x0) if hFile = 0x0 then renvoyer Faux
// CREATION DU MAPPING SUR LE FICHIER hFileMapping est un entier = 0x0 FileMap est une chaine asciiz sur 32 = <Nom du mapping> hFileMapping = appeldll32("KERNEL32","CreateFileMappingA",hFile,0x00,0x04,0,1024,&FileMap) if HFileMapping = 0x0 then renvoyer Faux
// CREATION DE LA VUE Ptr est un entier = 0x0 Ptr = appeldll32("KERNEL32","MapViewOfFile",hFileMapping,0x000F001F,0,0,1024) if Ptr = 0x0 then renvoyer faux
// LECTURE cBuffer est une chaine asciiz sur 129 = "" // 128 + 0x00 terminal transfert(&cBuffer, Ptr, 128) // Pas trop dur // ECRITURE transfert(Ptr,&cBuffer,128) // La on frise le délire ...
// DESTRUCTION DU FILE MAPPING appeldll32("KERNEL32","UnmapViewOfFile",Ptr) appeldll32("KERNEL32","CloseHandle",hFileMapping ) appeldll32("KERNEL32","CloseHandle",hFile)
Mais en tout cas je ne suis pas partisant du timer car trop de risque de perdre des données En apparence, cela parrait compliqué, mais c'est plus rapide et plus souple...
Bon windev |
| |
| |
| | | |
|
| | |
| |
Posté le 02 février 2006 - 10:29 |
Philippe Pasquali a écrit :
J'ai déjà utilisé ce système et il n'y a aucun problème PA est le premier programme PB est le second programme
1° Méthode pour signaler l'évenement //********** Dans Initialisation de PA et PB :Demander à Windows un numéro unique de message
WM_NumMessage est un entier WM_Message est une chaîne ASCIIZ sur 128 = "" NumEvenement est un entier = 0
WM_Message = "ICI METTRE UNE PHRASE UNIQUE MAX 127 CHAR" WM_NumMessage = AppelDLL32,"USER32.DLL","RegisterWindowMessageA",&WM_Message) Evénement(<procedure>, "*.*", WM_NumMessage) // Tester que WM_NumMessage>0
//********** Dans la fin du projet IF NumEvenement>0 THEN FinEvénement(NumEvenement)
// Entête de la procédure PROCEDURE <procedure>(pNumMessage, pwParam, pwLParam) .......
2° PA veut envoyer un signal à PB SendMessage(SysFenHandle(<Titre fenêtre B>), WM_NumMessage, wParam, wLParam) wParam, wLParam sont deux entiers libres....
MAINTENANT POUR PASSER UNE CHAINE, IL Y A : 1° Le fichier INI, TEXTE, HYPERFILE.... 2° Le file mapping un chouia plus complexe à mettre en oeuvre mais plus performant. Le principe c'est de reserver un zone du disque pour émuler une zone mémoire partagée 1/2 et en lecture 1/2 en écriture. L'avantage c'est qu'une fois l'information lue elle est automatiquement supprimée.
METHODE POUR CREER UN FILE MAPPING lpFileName est une chaine asciiz sur 32 = <Nom d'un fichier unique>
// CREATION DU FICHIER PHYSIQUE hFile est un entier = AppelDLL32("KERNEL32","CreateFileA",&lpFileName,0xC0000000,0x00000003,0x0,0x04,0x04000002,0x0) if hFile = 0x0 then renvoyer Faux
// CREATION DU MAPPING SUR LE FICHIER hFileMapping est un entier = 0x0 FileMap est une chaine asciiz sur 32 = <Nom du mapping> hFileMapping = appeldll32("KERNEL32","CreateFileMappingA",hFile,0x00,0x04,0,1024,&FileMap) if HFileMapping = 0x0 then renvoyer Faux
// CREATION DE LA VUE Ptr est un entier = 0x0 Ptr = appeldll32("KERNEL32","MapViewOfFile",hFileMapping,0x000F001F,0,0,1024) if Ptr = 0x0 then renvoyer faux
// LECTURE cBuffer est une chaine asciiz sur 129 = "" // 128 + 0x00 terminal transfert(&cBuffer, Ptr, 128) // Pas trop dur // ECRITURE transfert(Ptr,&cBuffer,128) // La on frise le délire ...
// DESTRUCTION DU FILE MAPPING appeldll32("KERNEL32","UnmapViewOfFile",Ptr) appeldll32("KERNEL32","CloseHandle",hFileMapping ) appeldll32("KERNEL32","CloseHandle",hFile)
Mais en tout cas je ne suis pas partisant du timer car trop de risque de perdre des données En apparence, cela parrait compliqué, mais c'est plus rapide et plus souple...
Bon windev
C'est vrais que les évènements permettent uniquement de passer des numériques. Mais ça permet de lancer des traitements différents suivant les valeurs récupéré. Le message permet surtout une interactivitée direct entre les applications. Perso moi je prend le WM_USER comme message (1024) qui n'est pas sensé être utilisé par le framework ou un quelconque objet. ce qui évite aussi l'appel aux API.
a++ Goof |
| |
| |
| | | |
|
| | |
| |
Posté le 03 février 2006 - 11:14 |
Je ferai une remarque supplémentaire concernant les "MessageWindows" : Les messages sont stockés dans une pile en attendant leur traitement, et lorsque la pile est pleine, les messages sont perdus !..... Par exemple, sur une CPU un peu lente, avec un utilisateur impatient qui "bouge sa souris" dans tout les sens ... ça créé mes centaines de messages .... et certains se perdent (la souris "saute" d'un point à un autre de l'écran lors du déplacement). Si tu as "Posté" un message à ce moment, il peut être perdu. Il faut donc rajouter une numérotation + un dialogue de "ré envoi" en cas de perte de sequence dans la numérotation pour le recepteur.
Gérard.
"Philippe Pasquali" <philippe.pasquali@bopack.com> a écrit dans le message de news: 43e1b6ab$1@news.pcsoft.fr...
J'ai déjà utilisé ce système et il n'y a aucun problème PA est le premier programme PB est le second programme
1° Méthode pour signaler l'évenement //********** Dans Initialisation de PA et PB :Demander à Windows un numéro unique de message
WM_NumMessage est un entier WM_Message est une chaîne ASCIIZ sur 128 = "" NumEvenement est un entier = 0
WM_Message = "ICI METTRE UNE PHRASE UNIQUE MAX 127 CHAR" WM_NumMessage = AppelDLL32,"USER32.DLL","RegisterWindowMessageA",&WM_Message) Evénement(<procedure>, "*.*", WM_NumMessage) // Tester que WM_NumMessage>0
//********** Dans la fin du projet IF NumEvenement>0 THEN FinEvénement(NumEvenement)
// Entête de la procédure PROCEDURE <procedure>(pNumMessage, pwParam, pwLParam) .......
2° PA veut envoyer un signal à PB SendMessage(SysFenHandle(<Titre fenêtre B>), WM_NumMessage, wParam, wLParam) wParam, wLParam sont deux entiers libres....
MAINTENANT POUR PASSER UNE CHAINE, IL Y A : 1° Le fichier INI, TEXTE, HYPERFILE.... 2° Le file mapping un chouia plus complexe à mettre en oeuvre mais plus performant. Le principe c'est de reserver un zone du disque pour émuler une zone mémoire partagée 1/2 et en lecture 1/2 en écriture. L'avantage c'est qu'une fois l'information lue elle est automatiquement supprimée.
METHODE POUR CREER UN FILE MAPPING lpFileName est une chaine asciiz sur 32 = <Nom d'un fichier unique>
// CREATION DU FICHIER PHYSIQUE hFile est un entier = AppelDLL32("KERNEL32","CreateFileA",&lpFileName,0xC0000000,0x00000003,0x0,0x04,0x04000002,0x0) if hFile = 0x0 then renvoyer Faux
// CREATION DU MAPPING SUR LE FICHIER hFileMapping est un entier = 0x0 FileMap est une chaine asciiz sur 32 = <Nom du mapping> hFileMapping = appeldll32("KERNEL32","CreateFileMappingA",hFile,0x00,0x04,0,1024,&FileMap) if HFileMapping = 0x0 then renvoyer Faux
// CREATION DE LA VUE Ptr est un entier = 0x0 Ptr = appeldll32("KERNEL32","MapViewOfFile",hFileMapping,0x000F001F,0,0,1024) if Ptr = 0x0 then renvoyer faux
// LECTURE cBuffer est une chaine asciiz sur 129 = "" // 128 + 0x00 terminal transfert(&cBuffer, Ptr, 128) // Pas trop dur // ECRITURE transfert(Ptr,&cBuffer,128) // La on frise le délire ...
// DESTRUCTION DU FILE MAPPING appeldll32("KERNEL32","UnmapViewOfFile",Ptr) appeldll32("KERNEL32","CloseHandle",hFileMapping ) appeldll32("KERNEL32","CloseHandle",hFile)
Mais en tout cas je ne suis pas partisant du timer car trop de risque de perdre des données En apparence, cela parrait compliqué, mais c'est plus rapide et plus souple...
Bon windev
|
| |
| |
| | | |
|
| | | | |
| | |
|