Bug WaitForSingleObject [Résolu]

Messages postés
13
Date d'inscription
lundi 7 février 2005
Dernière intervention
7 mai 2018
- - Dernière réponse : cs_barrique
Messages postés
13
Date d'inscription
lundi 7 février 2005
Dernière intervention
7 mai 2018
- 4 déc. 2007 à 09:29
Bonjour,

Je vous écrit car j'ai un petit problème avec l'instruction WaitForSingleObject.
J'ai un programme delphi qui permet l'installation de plusieurs mises à jour, j'ai donc utiliser WaitForSingleObject pour attendre la fin de la dernière mises à jour pour lancer la suivante.
Le problème est que mon code fonctionne très bien lorsque je le teste sur mon disque dur ou sur le réseau, par contre une fois qu'il est gravé sur un cd cela ne fonctionne plus du tout : les mises à jour se lancent toutes en mêmes temps ...
Je ne comprend pas pourquoi cela fonctionne très bien en local et pas sur le cd

Merci pour vos réponses

Voici le code utilisé

function LanceAppliAttenteFin(NomFichier:string; var ExitCode: DWORD):boolean ;
var
  StartInfo        : TStartupInfo;
  ProcessInfo            : TProcessInformation;
begin
  result:=true;
  ZeroMemory(@StartInfo, sizeof(StartInfo));
  StartInfo.cb:=sizeof(StartInfo);
  if CreateProcess(nil,PChar(NomFichier),nil,nil,true,0,nil,nil,StartInfo,ProcessInfo)  then
  begin
       Windows.WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
       Windows.GetExitCodeProcess(ProcessInfo.hProcess,ExitCode);
  end
  else result:=false;
end;
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
13
Date d'inscription
lundi 7 février 2005
Dernière intervention
7 mai 2018
3
Merci
Bonjour,

J'ai pris note des remarques que j'ai apporté dans ma fonction.
Par contre, je viens d'avoir l'explication de mon problème : je me servais de cette fonction pour lancer un installeur, or lorsque cet installeur est situé sur un support amovible, il se copie sur le disque dur, laisse la main, et s'exécute ensuite. Donc la fonction me disait que tout était terminé alors que l'exécutable du disque dur était toujours en cours.
C'est pour cela aussi que cela fonctionnait correctement à partir du lecteur réseau.

Merci pour votre aide

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 114 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_barrique
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
15
0
Merci
Vérifie les droits d'accès au fichier gravé..
Un avatar c'est quand même mieux non ?

cantador
Commenter la réponse de cs_cantador
Messages postés
13
Date d'inscription
lundi 7 février 2005
Dernière intervention
7 mai 2018
0
Merci
Bonjour,

J'ai regardé les droits d'accès et il n'y a rien de spécial mis à part le fait que l'exécutable est en lecture seule, ce qui est normal

Je vois pas où chercher

Merci pour vos réponses
Commenter la réponse de cs_barrique
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
39
0
Merci
Salut,

je n'ai pas de solution directe à ton problème mais il existe une alternative moins élégante mais tout aussi efficace :
Voir ce codehttp://tempuri.org/tempuri.html
 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
Messages postés
13
Date d'inscription
lundi 7 février 2005
Dernière intervention
7 mai 2018
0
Merci
Bonjour cirec,

J'ai testé la 2ème solution et j'ai le même problème.
En +, elle ne me conviendrait pas car j'atend un code retour de l'application que je lance et c'est moins fiable que de passer par un CreateProcess

Je continue à chercher mais en vain jusqu'à maintenant

Merci
Commenter la réponse de cs_barrique
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
15
0
Merci
Félicitations pour ton avatar..
Essaie l'autre API du même style :WaitForMultipleObjects

cantador
Commenter la réponse de cs_cantador
Messages postés
1270
Date d'inscription
samedi 14 août 2004
Dernière intervention
5 avril 2012
3
0
Merci
Bonsoir,

Quelques remarques et idées juste en passant :
  Un  ZeroMemory(@ProcessInfo, sizeof(TProcessInformation)); serait le bien venu.
  La libération des handles alloués également :
  CloseHandle(ProcessInfo.hProcess);      
  CloseHandle(ProcessInfo.hThread);
  Il serait plus normal d'initialiser au début de la fonction la variable result à false et ne la mettre à true après Windows.GetExitCodeProcess(ProcessInfo.hProcess,ExitCode);
  La variable lpCurrentDirectory ne devrait pas etre initialisée à autre chose que nil ? car actuellement elle pointe sur le lecteur cdrom protégé en écriture... Qui sait ?
  As tu vérifié la valeur de retour de WaitForSingleObject ? Pas de WAIT_FAILED par exemple en retour ? 
  De quel façon sont lancées les mises à jour ?
 
Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
Commenter la réponse de WhiteHippo

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.