1 appli lancée 2 fois

Résolu
9sber Messages postés 28 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 14 septembre 2004 - 19 août 2004 à 10:52
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 - 20 août 2004 à 17:10
Salut
Je voudrais savoir comment je peux gérer le nombre de fois qu'une application est lancée. Explication:
J'ai créé un prog qui ouvre une fenetre.
quand, je lance le .exe, il m'ouvre la fenetre.
Quand je lance une seconde fois le .exe, je voudrais qu'il fasse autre chose (ouvrir une autre fenetre = executer une autre fonction de mon programme).
Qu'est ce que je dois modifier dans mon main pour cela?

#include "Amoi.h"
int main(int argc,char* argv[]){
Amoi myApp(argc,argv);
return true;}

37 réponses

DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
20 août 2004 à 17:10
ben si tu veux que ce soit portable, prends la solution de mon fichier que tout le monde ne trouve pas beau mais que tout le monde fais dans le cas de dev professionnel. Faisant parti de cette derniere categorie, je ferais comme ca....
1
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
19 août 2004 à 11:31
Salut,

Je pense que tu pourrais mettre une variable ds une section shared, comme :

#pragma data_seg("Shared")
int iNbre = 0;
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws")

Tu verifies la valeur :

if (iNbre) ExecuteCa;
else ExecuteCi;

Puis apres, iNbre++;

Voila, essaye, je pense ke ca pourrait marcher, enfin ca doit marcher !

++
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
19 août 2004 à 11:33
Hum,
ce n'est pas tout simple, soit tu peux chercher si la fenêtre est déjà ouverte avec la fonction FindWindow dont voici le prototype:
HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName );


Donc tu auras remarqué que cette fonction prend deux paramètre, c'est tout simple, si la fonction ne trouve pas la fenêtre voulue elle retourne NULL, donc par exemple:

if( FindWindow( "ClassDeLaFenetre1", "TitreFenetre1" ) == NULL )
    // fait ce qui doit faire lors de la deuxieme ouverture.


Rien de plus simple, il existe encore d'autres fonctions, mais je ne programme plus en win32, je ne pourrais donc pas t'aider plus que ça :)

bonne chance encore ;)

[DmX]
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
19 août 2004 à 11:33
Je vois 2 possibiltees mais qui toutes fois se base sur le meme principe:

Dans ton main tu verifie la presence d'un fichier par example dummy qui est sera a cote de ton exe, si il n'existe pas, tu le cree; si il existe tu fais rien ( si ce n'est qu'executer les autres fonctions de ton prog). Au deuxieme lancement, il va trouve le fichier => tu ne va rien faire

=> tu sais si c'est la premiere fois que tu as lance ton appli

La deuxieme maniere de proceder est d'ecrire une clef dans la base de registre.

Voila c'est pas tres propre, mais a ma connaissance il n'y a pas de flag passe au main ou tout autre chose dans windows qui te permet de savoir si c'est la premiere fois qu'on lance un prog.

@+

Fred
0

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

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
19 août 2004 à 11:38
DevGizmo > Et que se passe til si le prog se finit "bizarrement" (pour pas dire plante) et ke le fichier ne peut pas etre effacé ? Pareil pour la base de registre..
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
19 août 2004 à 11:41
AlexMAN: bonne remarque mais etant donne que c'est la premier traitement qui sera effectue, je ne pense pas qu'il y est de probleme...
Soit dit en passant si l'ecriture dans une shared zone, venait a mal se passe ou ue ca plante; croit tu que c'est plus fiable.?

@+

Fred
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
19 août 2004 à 11:44
Un programme n'est jamais à l'abri d'un crash (ou rarement), il peut par exemple planter à cause d'un manque de mémoire, qui ne serait pas exemple pas traité! Tout peux faire planter un programme, c'est dangereux de faire cela car si tu crée le fichier et que tu ne sait plus l'effacer le programme ne fera plus qu'exécuter les autres fonctions!

Je pense que tu devrais voir mon code AlexMan peut être qu'il pourra t'aider, je n'en suis pas sur car je ne fais plus de win32 mais ça se pourrait :)

bonne chance :)

[DmX]
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
19 août 2004 à 11:49
La solution ki consiste a ecrire ds un fichier ou une cle ds la base de registre n'est pas du tt bonne. Si le programme plante, le fichier/la clé ne sera pas effacé(e) donc le prog n'executera pas ce kil doit executer, a ne pas faire donc.
DevGizmo, pkoi tu veux ke l'ecriture ds une section shared se deroule mal ? aucune raison.

Voir source Brunews (et commentaires oci) : http://www.cppfrance.com/code.aspx?ID=25238

++
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 août 2004 à 11:50
http://www.cppfrance.com/code.aspx?id=25238

deux codes qui permettent de ne lancer le porgramme qu'une seule fois, le premier utilise la section shared, le second, vous regarderez, jai pas fait moi meme. a adapter. effectivement l'ecriture ds la bdr me semble pas tres propre (meme sans regarder les commentaires sur la source donnée en lien ici).

petite remarque sans vraiment d'interet, juste pour les puristes, ++i est plus efficace que i++
(essayer d'ecrire les opérateurs de post et pre incrementation, vous verrrez, si vous voulez l'explication, demandez)
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
19 août 2004 à 11:51
Euh mince désolé je me suis trompé de nom, ce n'est pas AlexMan qui doit mieux regarder mon code mais 9sber :D

j'espère que tu trouvas ce qu'il faut :)

ciao ;)

:.: [DmXx] [[irc://irc.quakenet.org/ex-concept #eX-Concept @ QNet]]:.:
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
19 août 2004 à 12:00
Alexman a ecrit: "DevGizmo, pkoi tu veux ke l'ecriture ds une section shared se deroule mal ? aucune raison."

Aucune raison non plus que le fichier ne soit pas cree ou efface...
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
19 août 2004 à 12:02
Coupure de courant, ton prog n'a pas le temps de supprimer le fichier, t'es baisé (excuse moi l'expression). L'ecriture ds la section shared est plus sur.
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
19 août 2004 à 12:07
et si la coupure de courant intervient juste avant l'ecriture dans ta section shared...???
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
19 août 2004 à 12:11
"et si la coupure de courant intervient juste avant l'ecriture dans ta section shared...???"

DevGizmo > ou est le pb ?

leprov > Je suis curieu de savoir pkoi la postincrémentation est moins bien ke la preincrementation . Desassembly :

; 86 : ++i;

mov edx, DWORD PTR _i$[ebp]
add edx, 1
mov DWORD PTR _i$[ebp], edx

; 83 : i++;

mov edx, DWORD PTR _i$[ebp]
add edx, 1
mov DWORD PTR _i$[ebp], edx

Aucune difference ! Enfin, jme trompe ptet, donc si tu pouvais mexpliker, merci.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 août 2004 à 12:21
regarde les operations effectuées. on est daccord que un operateur est une fonction. ca effectue des operations, puis ca renvoie une valeur

++i:
operations effectuées:
{
return i = i+1;
}

i++
operations effectuées:
{
type interm = i;
i = i + 1;
return interm;
}

je sais pas si cest clair pr tt le monde.....
si je fait
cout << i++;

(je fais sur deux lignes, paske selon le compiilateur, mettre les 2 sur une seule ligne ne ferais pas le traitement attendu)

je doit donc afficher i et incrementer i en une seule operation, je peux pas le faire en un seul traitement comme tu semble le penser.....je dois donc incrementer i d'un coté, puis retourner une copie que j'avais fait au préalable de i. voila
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
19 août 2004 à 12:27
Non pas d'accord du tt avec ca, regarde le desassembly ke j'ai posté, c tt simple, enleve toi cet idée de la tete.
lors de ton cout, le compilo appelera cout avec la valeur de i puis incrementera, alors ke si tu fais un cout << ++i, le compilo incrementera i et appellera cout, c tt simple, pas distoire de fonction, operateurs...

++
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
19 août 2004 à 12:43
"DevGizmo > ou est le pb ?"
ben apres le flag ne pourra pas etre teste,et on en revient au meme point: tu n'est pas sur que ce soit la premiere execution.

D'autre part, ta solution est invalide car des que l'on redemarre le PC, la shared zone est videe ( shared zone > stockage dans le fichier d'echange de windows) donc ca ne marche pas....

@+
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
19 août 2004 à 12:47
ET alors ? on se fout de savoir qu'au dernier demarrage de l'ordi, l'user a executé tant de fois l'applic, c pas ca kil veut ! C ds la mm session, et puis listoire de la coupure de courant ne s'applike pas ds le cas de la section shared, puis ce ke lordi redemarrera, et jle repete, on se fout de la precedente session !

++
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 août 2004 à 13:00
>>AlexMan : j'ai fait un test de durée, jai fait 2 programmes qui cronometres ceci avec timer une classe qui cronometre le tps d'execution du programme en tick d'horloge (source pompée sur le site pour pas me casser le cul, merci a celui qui a posté):
for (Timer.start(); i < 500 000 000; ++i)
Timer.stop();
cout << Timer.GetTime();

et la meme chose avec un i++

bon j'ai executé les 2 plusieurs fois puisque le tps d'exec ne peut etre constant, a cause du multitache, mais en moyenne le i++ est plus élevé, alors cout du sort, ou ca verifie ce que j'ai dit? je pense que le debat est ouvert. si quelqu'un d'autre a son grain de sel a ajouter, vaut mieux créer un autre post pour pas polluer celui la
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
19 août 2004 à 13:38
Alexman: Je prefere ne plus continuer sur ce post...........
Tu en deduira ce que tu voudras...

Tout ce que je me dis, c'est que ce n'est pas un vari echange comme sur les VRAIS forum de dev...
Va faire un tour de ce du gnu et tu comprendras ce que je veux dire...
Decidemment les "frenchies" en prog ils prennent un peu trop le "bocal"...
0
Rejoignez-nous