Application lanceur programmes [Résolu]

Signaler
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
26 janvier 2011
-
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
26 janvier 2011
-
Salut!

Je voudrais réaliser un programme qui permet d'appeler un exécutable à une période définie.
Il faut donc que mon programme n'attende pas la fin de l'autre pour pouvoir continuer à compter le temps.

J'utilises du C++ classique (C++/GCC).
Comment je pourrais faire ceci, sachant que la fonction system() est bloquante...

Merci bien :)

Aurélien

19 réponses

Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
26 janvier 2011
1
Je vais donc récapituler :
Pour appeler un programme extérieur sans rester bloquer, plusieurs solutions :
 - appeler le programme à l'aide de ShellExecute :
    - ShellExecuteA(0, 0, "programme.exe", "argument", 0, SW_SHOWNORMAL);
    - ShellExecute(0, 0, L"programme.exe", L"argument", 0, SW_SHOWNORMAL);
inclure :
#include <windows.h>
#include <shellapi.h>
Cette solution est valable seulement sous Windows.

 - créer un thread et lui affecter le nouveau programme à l'aide de la librairie boost :
#include
void uneFonction()
{
boost::thread unThread(&system("mail.exe G150"));
}

Non tester, portable sous toutes les plateformes.
Plus d'infos sur la librairie boost : http://www.boost.org/

Merci à tous! :)
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Salut aurelien,

si tu rajoutes windows.h, je pense que tu pourras te servir de la fonction ShellExecute qui n'est pas bloquante.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
26 janvier 2011
1
Merci pour ta réponse.

En appelant mon programme comme ceci :
ShellExecute("mail.exe G150");

j'obtiens cette erreur à la compilation :

mondialogueimpl.cpp: In member function `void MonDialogueImpl::slotChangeTitre()':
mondialogueimpl.cpp:20: error: cannot convert `const char*' to `HWND__*' for argument `1' to `HINSTANCE__* ShellExecuteW(HWND__*, const WCHAR*, const WCHAR*, const WCHAR*, const WCHAR*, INT)'
mingw32-make[1]: *** [release\mondialogueimpl.o] Error 1
mingw32-make: *** [release] Error 2

si quelqu'un a une solution pour la résoudre svp :$

Merci :)
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
Salut, je te conseil de threadé ton appel à system, en utilisant les threads de boost, tu auras en plus un prog portable d'un OS a l'autre.

#include

void uneFonction()
{
boost::thread unThread(&system("mail.exe G150"));
}

<hr size="2" width="100%" />TuRn3r
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Houla oui il te manque plein de choses ! lol
Voilà un exemple d'utilisation :
ShellExecute(NULL, NULL, "mail.exe", 0, 0, SW_SHOWNORMAL);

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
26 janvier 2011
1
La portabilité  ne m'intéresse pas, le programme tournera uniquement sous Windows.
La solution de yoyo me plait, j'avais peur de devoir passer par des for()k et des exec() ....
a peu prêt équivalent au thread quoi...
info je me pencherai peut-etre sur ta solution turnerom, mais qu'est cette classe boost ?

Effectivement yoyo, c'est pas bien ce que j'ai fait, j'ai même pas chercher la définition de la fonction...
Par contre j'ai la même erreur avec l'argument 3 cette fois....

Merci :)
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Si tu veux passer des arguments à ton exe faut faire ça (vu dans la doc ) :
ShellExecute(NULL, NULL, "mail.exe", "G150", 0, SW_SHOWNORMAL);

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
26 janvier 2011
1
désolé mais

ShellExecute(NULL, NULL, "mail.exe", "G150", 0, SW_SHOWNORMAL);

me donne toujours :

mondialogueimpl.cpp: In member function `void MonDialogueImpl::slotChangeTitre()':
mondialogueimpl.cpp:21: error: cannot convert `const char*' to `const WCHAR*' for argument `3' to `HINSTANCE__* ShellExecuteW(HWND__*, const WCHAR*, const WCHAR*, const WCHAR*, const WCHAR*, INT)'
mingw32-make[1]: *** [release\mondialogueimpl.o] Error 1
mingw32-make: *** [release] Error 2

Merci :)
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Ah ! C'est que tu es en UNICODE !
Dans ce cas, je suppose qu'il faut que tu convertisses les chaines en UNICODE.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
26 janvier 2011
1
Je me doutais qu'il me manque quelque chose puisqu'il ne reconnait pas le type WCHAR* ...
Par contre comment faire?
J'ai déjà testé ça :
WCHAR* toto = "mail.exe";

mais le compilo refuse...
ou encore le cast sur la commande :
ShellExecute(NULL, NULL, (WCHAR*)"mail.exe", "G150", 0, SW_SHOWNORMAL);

veut pas non plus...

Merci :)
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Essaye ça (je ne sais pas du tout si ça marche) :
WCHAR toto;
wcscpy(toto, "mail.exe");

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Sinon utiliser la version ANSI ShellExecuteA.
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Oui s'il t'es possible de changer, fais-le, au moins pour voir si ça compile bien !

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
181
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
26 janvier 2011
1
Ok
Ca marche niquel avec cette comande! :)
ShellExecuteA(NULL, NULL, "mail.exe", "G150", 0, SW_SHOWNORMAL);

Par contre, pensez vous que c'est plus propore comme ça ou plus propre avec la classe Boost et de créer un thread?

Merci à tous ! :)
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Si cette fonction te suffit je pense que c'est le mieux.
Mais c'est sur que si tu cherches à programmer sous linux ou autre, il vaudra mieux changer.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Une dernière chose, pense à accepter la ou les réponses qui t'ont permis de résoudre ton problème.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
ohe yoyo >
WCHAR toto;
wcscpy(toto, "mail.exe");
tu copies sur quoi ???

_TEXT("mail.exe")
ou
L"mail.exe"
pour déclarer une chaine unicode.

WCHAR toto[12];
wcscpy(toto, L"mail.exe"); // la c'est OK

ciao...
BruNews, MVP VC++
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Effectivement elle est jolie celle-là !
Merci pour avoir corrigé et pour les info.
Décidément, aujourd'hui j'aurai encore appris pas mal de trucs.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
On peut même déclarer une chaine unicode sans utiliser wcscpy:
WCHAR text[]=L"mail.exe";
On n'est même pas obligés de la déclarer puisqu'on peut l'utiliser directement dans l'appel de la fonction:
ShellExecute(0, 0, L"mail.exe", L"G150", 0, SW_SHOWNORMAL);
Si on n'a pas besoin des chaines unicode , il est péférable de modifier les propriétés du projet en spécifiant "Non défini" comme jeu de caractères.