Bonjour,
Avant que je vous parle de mon probleme je vous explique ce que je veux coder :
J'ai une application principale(un programme, non pas une interface graphique) qui doit faire appel à d'autres programmes (des executables) qui risquent de boucler. J'ai un timer qui calcule la durée d'execution de ces autres programmes si l'un d'eux dépasse un certain temps d'execution je doit l'arreter sans pour autant que mon application principale ne soit affecté par cet arret brusque.
Pour faire cela jai choisi d'utiliser wxProcess et wxExecute car on peut les utiliser sous windows et Unix (mon application doit tourner sous les deux OS).
J'ai étudié un peu le sample exec fourni dans la doc de wxWidget, je m'en suis donc inspiré afin d'essayer de tester ce que je veu faire et voir si c'est possible ou pas.
Voici mon code
Mon programme execute en gros une commande (un executable qui affiche Hello World) en mode asynchrone, donc normalement il devrait sortir de la boucle while, mais ce n'est pas le cas il boucle à l'infini au niveau du while méme si le hello world a fini (avec un ps -ux je vois bien qu'il a fini de s'executer).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 #include "wx/process.h" #include "wx/app.h" #include <iostream> using namespace std; class MyProcess : public wxProcess, public wxApp { public: MyProcess(const wxString& cmd) : wxProcess(0), m_cmd(cmd){ } virtual void OnTerminate(int pid, int status){ } protected: wxString m_cmd; }; int main(int argc, char ** argv){ if(argc !=2){ cerr << "Usage : " << argv[0] << " <exec_cmd> " << endl; exit(1); } const char * commande = argv[1]; wxString cmd(commande, wxConvLocal); MyProcess * process = new MyProcess(cmd); int pid = wxExecute(cmd, wxEXEC_MAKE_GROUP_LEADER | wxEXEC_ASYNC, process); cout << " process pid " << pid << endl; while(wxProcess::Exists(pid)){ cout << " le process existe toujours " << endl; } cout << " le process est mort " << endl; return 0; }
Une petite remarque : si j'enleve le public wxApp de cette linge : class MyProcess : public wxProcess, public wxApp
Le programme ne s'execute pas car je compile en mode debug et au niveau de la doc de wxExecute il y a cette note qui explique la ligne en question :
NB: Currently wxExecute() can only be used from the main thread, calling this function from another thread will result in an assert failure in debug build and won't work.
J'espere de l'aide car franchement ca commence à me gonfler cette histoire du programme qui boucle et j'espere que je peux trouver une solution à ceci avec wxExecute.
Et si dans le pire des cas : ce que je veu faire n'est pas réalisable avec la lib wxWidget m'orienter vers une lib multi-Os qui peut m'aider à faire la méme chose.
Merci d'avance
Partager