Bug WaitForSingleObject [Résolu]

cs_barrique 13 Messages postés lundi 7 février 2005Date d'inscription 7 mai 2018 Dernière intervention - 30 nov. 2007 à 15:53 - Dernière réponse : cs_barrique 13 Messages postés lundi 7 février 2005Date d'inscription 7 mai 2018 Dernière intervention
- 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
cs_barrique 13 Messages postés lundi 7 février 2005Date d'inscription 7 mai 2018 Dernière intervention - 4 déc. 2007 à 09:29
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

Merci cs_barrique 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de cs_barrique
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 30 nov. 2007 à 18:43
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
cs_barrique 13 Messages postés lundi 7 février 2005Date d'inscription 7 mai 2018 Dernière intervention - 3 déc. 2007 à 09:05
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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 3 déc. 2007 à 11:48
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
cs_barrique 13 Messages postés lundi 7 février 2005Date d'inscription 7 mai 2018 Dernière intervention - 3 déc. 2007 à 14:35
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 3 déc. 2007 à 18:53
0
Merci
Félicitations pour ton avatar..
Essaie l'autre API du même style :WaitForMultipleObjects

cantador
Commenter la réponse de cs_cantador
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 4 déc. 2007 à 02:22
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.