Déclenchement automatique de programme par enregistrement de fichier

Résolu
Houelb - 8 oct. 2012 à 11:03
 Houelb - 30 oct. 2012 à 19:54
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

7 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
8 oct. 2012 à 18:30
Bonjour.

Te serait-il possible de démarrer ta tâche en mode bloquant ? C'est-à-dire que ta boucle resterait en suspend le temps de l'exécution de celui-ci ?
Si ce n'est pas possible, tu peux essayer de débloquer ta boucle lorsque le fichier dans lequel écrit le programme se ferme (sous Linux je fais ça avec iNotify, il me semble que l'équivalent Windows est FindFirstChangeNotification, doc ici: http://msdn.microsoft.com/en-us/library/aa364417%28VS.85%29.aspx).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
8 oct. 2012 à 21:10
Salut,

il suffit de lancer ton ::CreateProcess() en mode "modal",


    STARTUPINFO si;
    PROCESS_INFORMATION pi;


/* BEGIN LOOP */

 // FaitQuelquechose()...


    // Lance un "child process"
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( !::CreateProcess( 
NULL, 
 	_T(""LE_PROGRAMME_A_LANCER.exe""),   
        NULL,    
        NULL,      
        FALSE,  
        0,  
        NULL,
        NULL,
        &si,        // STARTUPINFO structure
        &pi ))      // PROCESS_INFORMATION structure
     
{
    		printf( "CreateProcess failed (%d)\n", GetLastError() );
    		return EXIT_FAIL;
}

    	// Attend que le process enfant finisse
WaitForSingleObject( pi.hProcess, INFINITE );

// Ferme proprement
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

 // FaitQuelquechose()...

/* END LOOP */



bye...
3
Merci CptPingu ... j'ai pas vraiment de mode bloquant mais mon programme ne fait rien en attendant et ce n'est pas un problème je vais regarder FindFirstChangeNotification avec l'option FILE_NOTIFY_CHANGE_LAST_WRITE sur mon fichier de sortie.

Merci yann_lo_san en effet quelqu'un m'avait orienté comme toi vers le createprocess et ça marche en ce qui concerne le lancement du programme de simulation dans mon cas.

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 etc ...
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 ?

En tous les cas merci pour vos réponses.
Houelb
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 oct. 2012 à 16:01
Je ne sais pas vraiment comment faire, ni si tu peux réaliser ce genre d'action (je connais très mal Windows).
Néanmoins, je sais qu'il existe un outil qui permet de manier des fenêtres via un script: autoit.
(Cf: http://www.autoitscript.com/site/autoit/)

Peut être que ça pourrait t'aider.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci CptPingu je vais regarder ça de plus près et si j'arrive à me dépêtrer de mon pb je ferai un up pour faire partager
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
11 oct. 2012 à 20:26
Re,

On peut piloter le processus lancé avec createProcess si on connait les classes des controles/boutons/texte ect... à modifier/cliquer/ouvrir ect...

Exemple, après avoir lancé le process "Calculatrice Windows"
La mettre en premier plan et appuis sur la touche 'R'

HWND h = ::FindWindow("SciCalc", NULL);
::SetForegroundWindow(h);
::PostMessage(h, WM_KEYDOWN, 'R', 0);
::PostMessage(h, WM_KEYUP, 'R', 0);



Sinon, il y a latechnologie DDE (Dynamic Datas Exchange) qui permet à une application s'incrivant en tant que serveur DDE de pouvoir etre pilotée par des "clients DDE", voir les APIs Win32 DDE...

Il faut bien sur que le programme que tu lances ai prévu cela (voir dans sa documentation)

Bye...
3
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
3
Rejoignez-nous