Déclenchement automatique de programme par enregistrement de fichier [Résolu]

Houelb - 8 oct. 2012 à 11:03 - Dernière réponse :  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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
cptpingu 3807 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 21 septembre 2018 Dernière intervention - 8 oct. 2012 à 18:30
3
Merci
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

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cptpingu
Meilleure réponse
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 8 oct. 2012 à 21:10
3
Merci
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...

Merci yann_lo_san 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de yann_lo_san
Meilleure réponse
3
Merci
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

Merci Houelb 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Houelb
Meilleure réponse
cptpingu 3807 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 21 septembre 2018 Dernière intervention - 9 oct. 2012 à 16:01
3
Merci
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

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cptpingu
Meilleure réponse
3
Merci
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

Merci Houelb 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Houelb
Meilleure réponse
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 11 oct. 2012 à 20:26
3
Merci
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...

Merci yann_lo_san 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de yann_lo_san
Meilleure réponse
3
Merci
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

Merci Houelb 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Houelb

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.