Déclenchement automatique de programme par enregistrement de fichier

Déclenchement automatique de programme par enregistrement de fichier - C++ - Programmation

Marsh Posté le 08-10-2012 à 10:05:17    

Bonjour,
 
Je conçois un programme qui doit boucler un certain nombre de fois seulement au milieu de la boucle il lance un autre programme (dans mon cas c'est un soft de simulation de flux) le programme exterieur tourne un certain temps (temps inconnu) puis écrit des infos dans un fichier output classique (sans doute du texte) et se ferme. La boucle principale est censée reprendre à ce moment là.
 
Ma question est donc y a t il une sorte de trigger, un moyen de surveiller les évènements windows ? l'idée serait que ma boucle fasse l'etape 1 puis 2 puis pause le temps de la simulation sur le soft exterieur et que l'étape 3 démarre dès l'enregistrement du fichier est faite ensuite étape 4 puis 1 puis 2 etc ...
 
Vos suggestions sont les bienvenues merci d'avance.
Houelb

Reply

Marsh Posté le 08-10-2012 à 10:05:17   

Reply

Marsh Posté le 08-10-2012 à 11:10:18    

Bonjour,
Sous windows quand tu lance un nouveau process via createprocess(), tu récupères un handle dessus, ce qui te permet de te synchroniser dessus via waitforsingleobject() par exemple...


Message édité par breizhbugs le 08-10-2012 à 11:10:35

---------------
Seul Google le sait...
Reply

Marsh Posté le 09-10-2012 à 15:35:39    

Merci pour ta réponse rapide breizhbugs, en effet ça fonctionne de ce que j'ai réussi à en faire (je ne suis malheureusement pas un expert).
Maintenant ma question devient "comment faire faire des choses au programme entre le moment où il est lancé et le moment où il se ferme". Dans mon cas ce sera 1) ouvrir un modele de simulation 2) faire tourner la simulation 3) enregistrer certaines choses 4) quitter.  
Faut il que je contacte l'editeur du soft de simulation absolument ou à partir du logiciel puis je savoir comment s'appellent les fonctions internes et comment les lancer ?
 
Merci d'avance pour vos réponses
 
PS: je met dans la suite de ce message mon code test qui permet bien de lancer un process exterieur et d'attendre qu'il soit fini pour reprendre la boucle des instructions (j'ai fait ça sur windows media player pour le test)
 
 
///////////////////////////////////////////////////////// CODE
 
void etape3()
{
cout<<"etape 3 checked"<<endl;
}
 
void etape2()
{
CString cmdLine;
cmdLine= "\"C:\\Program Files\\Windows Media Player\\wmplayer.exe\""; // creer le chemin pour acceder au programme exterieur
 
PROCESS_INFORMATION processInformation = {0};
STARTUPINFO startupInfo = {0};
startupInfo.cb = sizeof(startupInfo);
int nStrBuffer = cmdLine.GetLength() + 50;
 
bool result =CreateProcess(NULL, cmdLine.GetBuffer(nStrBuffer), NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &startupInfo, &processInformation);
 
cmdLine.ReleaseBuffer();
 
WaitForSingleObject( processInformation.hProcess, INFINITE ); // on detecte que le programme exterieur a fini
 
// on ferme les handles.
CloseHandle( processInformation.hProcess );  
CloseHandle( processInformation.hThread );
 
cout<<"etape 2 checked"<<endl;
 
etape3();
 
}
 
void etape1(int &i)
{
i=i+1; // on valide que le tour a bien débuté et on incrémente le nombre de tours
 
cout<<"etape 1 checked"<<endl; // c'est fait
 
etape2(); // on passe à l'étape suivante
}
 
void main()
{
cout<<"c'est parti"<<endl;
 
int i=0;
while (i<10)
{
cout<<i;
etape1(i); // démarrage initiale (tour numéro 0) et boucle 10 fois
}
}

Reply

Marsh Posté le 09-10-2012 à 16:59:48    

Si tu n'es pas fixé sur le C++ tu peux regarder autoit qui permet de faire de l'automatisation assez facilement (lancer une appli, attendre l'affichage d'une fenêtre, cliquer sur un bouton).

Reply

Marsh Posté le 30-10-2012 à 19:56:46    

Bonjour tout le monde, je reviens donner des nouvelles concernant mon problème.
Alors il semble que:
 
- soit je doive passer par une application tiers du type "autoit". Option fort peu probable car j'ai besoin de faire bcp de cycle, mes temps de calcul risquent déjà d'être assez conséquent vu la complexité du probleme alors si mon programme doit ouvrir le soft avec son interface graphique puis jouer avec les menus c'est mort ... Quest sur un PC neuf à l'heure actuel c'est plusieurs minutes au démarrage multipliez ça par les milliers de boucles de la métaheuristique que je colle dessus fois les milliers de scénarii supplémentaires modélisant mon environnement fois les replications internes à la simulation cette option n'est juste pas envisageable.
 
- soit je lance le soft de simu "en fond". J'avais déjà fait ça pour un autre projet avec un soft de simulation différent (Siman Arena pour ceux qui connaissent) je posais ce topic ici pour savoir si quelqu'un connaissait un autre moyen apparemment ce n'est pas le cas.
 
Pour les gens qui en aurait l'utilité j'explique la seconde solution. Il s'agit d'appeler le moteur du soft de simulation (pour Siman Arena c'est un fichier en .p) sur le modele de simulation via la commande system("model.p" ) et le programme laisse la main au soft le temps de la simu qui se déroule "en fond" au sens où on se sert du moteur mais on ne lance pas le .exe, l'interface graphique et tout ce qui pompe du temps. Une fois la simu terminée le soft rend la main au programme.
 
La principale difficulté (également la raison pour laquelle j'étais venu ici) c'est qu'il faut que les développeur aient prévu cette possibilité d'utiliser le moteur du soft sans l'interface graphique et il faut également les contacter pour connaitre un minimum la syntaxe qu'ils y ont affecté. Une fois qu'on a ça c'est bon.
 
En tous les cas merci à ceux qui ont répondu et m'ont permis d'y voir plus clair
 
Houelb

Reply

Marsh Posté le 31-10-2012 à 00:01:51    

Cedric_houelb a écrit :


Maintenant ma question devient "comment faire faire des choses au programme entre le moment où il est lancé et le moment où il se ferme". Dans mon cas ce sera 1) ouvrir un modele de simulation 2) faire tourner la simulation 3) enregistrer certaines choses 4) quitter.  


Ca ça dépend de quel genre de soft il s'agit:
- si c'est un programme console, il "suffit" de le creer en redirigeant les entrées/sorties
 
- Ca a plutôt l'air d'être un programme style windows avec GUI. Dans ce cas la sous windows sois le programme a quelque chose de prévu pour être automatiser (genre des arguments en ligne de commande, ne serait ce que pour ouvrir un fichier) et la il faut l'appeler avec les bons arguments
Sinon avec des outils comme winspy++ (je crois) il est capable d'enregistrer tout les messages windows envoyé par l'utilisateur (via clavier / souris) et de récupérer à quel handle de widget ils ont été envoyé et cela devrait te permettre de trouver les composants auquel envoyé les messages.
winspy++ doit utiliser les hooks genre JournalRecordProc: http://msdn.microsoft.com/en-us/li [...] 85%29.aspx ainsi que JournalPlaybackProc  
( bien sur cela suppose que la manip soit strictement identique pour chaque simulation )
 
Sinon peut être que des fonctions comme ChildWindowFromPoint EnumChildWindows FindWindowEx pourront t'aider dans la recherche des bouton à activer programmatiquement, et sendmessage/postmessage/postthreadmessage pour activer les dits boutons.


---------------
Seul Google le sait...
Reply

Marsh Posté le 01-11-2012 à 10:54:23    

Salut, merci Breizhbugs.
En effet il s'agit plus d'un programme avec interface graphique etc ... donc comme je le disais dans le message précédent (et comme tu le dis toi aussi) je vais demander aux dev de la boites qui a fait le soft  (en esperant qu'ils l'aient prévu) de me donner la syntaxe et l'appeler avec les bons arguments.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed