Application lanceur programmes

Résolu
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 - 15 janv. 2007 à 13:58
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 - 16 janv. 2007 à 08:25
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

aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
16 janv. 2007 à 08:25
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! :)
3
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 14:16
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 !"
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
15 janv. 2007 à 14:39
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 :)
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
15 janv. 2007 à 14:50
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
0

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

Posez votre question
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 14:51
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 !"
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
15 janv. 2007 à 15:08
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 :)
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 15:13
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 !"
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
15 janv. 2007 à 15:21
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 :)
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 15:26
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 !"
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
15 janv. 2007 à 15:43
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 :)
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 15:47
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 !"
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
15 janv. 2007 à 15:58
Sinon utiliser la version ANSI ShellExecuteA.
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 16:00
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 !"
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
15 janv. 2007 à 16:20
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 ! :)
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 16:22
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 !"
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 18:04
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 !"
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 janv. 2007 à 19:32
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++
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
15 janv. 2007 à 19:58
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 !"
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
15 janv. 2007 à 21:07
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.
0
Rejoignez-nous