Exe, procedure, ou fonction orpheline :delphi [Résolu/Fermé]

Signaler
Messages postés
116
Date d'inscription
samedi 19 février 2011
Statut
Membre
Dernière intervention
3 août 2013
-
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
-
Bonjour,

Je me demandais si quelqu'un aurait une astuce pour faire que delphi lance une procédure de manière "orpheline" c'est à dire qu'il n'attende pas la fin de cette procédure pour continuer son chemin le but étant qu'il puisse lancer plusieurs fois la même procédure indépendement.

Si ce n'est pas possible auriez vous une astuce pour faire une appli qui lancerait un .exe sans le suivre c'est à dire elle le lance mais c'est tout , elle ne suit pas le bon déroulement ni rien elle le lance juste . Et dans l'idéal il faudrait pouvoir indiquer certains paramêtres au fichier executable



pour plus de détails voila mon problème:

J'ai créé une appli sous delphi 6 qui marche très bien sauf en un point qui casse tout...

Le but de cette appli est de copier tout le répertoire sélectionné dans toutes les clés usb qu'on va connecter durant l'exécution du programme.

Tout ca marche sauf que lorsqu'on connecte plusieurs clés en même temps il les rempli une à une au lieu de les remplir toutes en même temps (et le but évidement est de remplir 100 clés usb le plus rapidement possible avec le même répertoire se trouvant sur le disque dur). Pourtant je passe par un utilitaire de copie windows mais quand on connecte une deuxième clé usb la première copie se met en pause et ne reprend qu'après la fin de la deuxième. De ce fait le programme perd 70% de son intérêt.




Voilou

D'avance merci beaucoup pour votre aide.



9 réponses

Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
134
Pas à ma connaissance, ne serait-ce que du fait que delphi intègre un assembleur X86 Cisc, incompatible avec les plateformes mac Risc précédants la version Intel...
2
Merci

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

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
134
Je pense que l'emploi de la fonction Win32 'CopyFileEx' devrait faire l'affaire...
Et à titre d'info, pour appeler une application indépendante, il suffit d'utiliser la fonction 'ShellExecute', quant au fait de lancer une procédure sans attendre qu'elle finisse, il faut pour cela utiliser un thread...
Messages postés
16361
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843
Si je comprends bien tu vas faire autant de lectures des fichiers d'origines que de nombre de clés USB connectés... Or c'est plus rapide de faire une seule lecture de l'original en écrivant sur toutes les clés en même temps (vu que ce sont des supports différents) et si tu connectes une clé USB en cours de route tu pourrais partager la charge en faisant des lectures non plus sur les originaux mais sur les copies déjà effectuées...
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
134
Pour récupérer les paramètres de la ligne de commande, transmis par shellexecute, il faut utiliser 2 fonctions de l'unité System, 'ParamCount' qui donne le nombre de paramètres et 'ParamStr' qui renvoie la chaine du paramètre voulu.
Quant au hwnd demandé en 1er paramètre de ShellExecute, je n'ai pas essayé, mais ça doit marcher avec 0, le handle du bureau...
Sinon, je suis d'accord avec la précision de KX, c'est plus compliqué que de juste s'appuyer sur le cache disque, mais c'est sûrement beaucoup plus performant...
Messages postés
16361
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
2 843
Comme tu l'as dit, la vitesse de copie des USB est plus faible que celle du disque dur, c'est pour ça que pendant une écriture tu as largement le temps d'en démarrer une deuxième, troisième, voir quatrième...
Après je ne pense pas que ce soit vraiment plus compliqué à programmer, il suffit de lire des données (avec BlockRead de mémoire), puis de faire une boucle pour chaque port d'écriture (avec BlockWrite). Le plus compliqué je pense c'est de lister les fichiers d'un répertoire, mais je pense que c'est un problème que tu as déjà résolu.
Et puis soyons honnête, je doute que le Delphi soit véritablement le plus performant des langages pour faire des opérations d'aussi bas niveau...
Messages postés
116
Date d'inscription
samedi 19 février 2011
Statut
Membre
Dernière intervention
3 août 2013
8
Bonjour Nicocorico,

Merci de m'avoir répondu aussi rapidement.

Je me demandais comment récupérer au sein de mon exe lancé avec shellexecute, les parametres que je rentre dans l'appelle de shellexecute??

par exemple :
ShellExecute(Handle,'Open','C:\Windows\Calc.exe',nil,Nil,SW_SHOWDEFAULT);

Dans une autre application qui ouvre des page web je remplace les 2 champs "nil nil" par le chemin de la page web et son emplacement,
comment récupérer ce qui remplace les nil nil dans l'exe qui est ici représenté par c/windows/calc.exe

Et aussi esque le handle a un grand role à jouer ?

Merci d'avance
Bonne soirée.
Messages postés
116
Date d'inscription
samedi 19 février 2011
Statut
Membre
Dernière intervention
3 août 2013
8
Merci à vos réponses à tous les deux :)

Je pense que je vais simplement me contenter de la cache du dd et non de relire sur les clés en cours de remplissage.
Parce que le facteur limitant la vitesse de copie c'est l'usb 2 dont le débit est assez faiblard face à celui du sata 2.
Surtout dans la mesure ou je pense que les personnes qui vont se servir du prog désormais n'auront que 4 ports usb donc 4 copies de front.

Enfin la lecture unique avec remplissage simultané m'intéresse beaucoup aussi mais je pense que cela leur compliquerait trop les choses : / et ca me compliquerait sans doute beaucoup aussi, humble programmateur amateur du dimanche que je suis :) car je sais pas pourquoi mais j'ai l'intuition qu'il faut passer par des termes obscurs tels que "buffer" XD

En tout cas merci encore :)
Messages postés
538
Date d'inscription
vendredi 20 mai 2011
Statut
Membre
Dernière intervention
8 janvier 2018
98
L'appel de Application.ProcessMessage permet de signaler que les instructions suivantes peuvent être exécutées sans attendre le résultat des instructions précédentes normalement.
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
134
Pas exactement : ProcessMessage permet simplement de vider la liste des messages en cours de Windows, utile lors d'un traitement long dans le thread principal de l'application...
Messages postés
116
Date d'inscription
samedi 19 février 2011
Statut
Membre
Dernière intervention
3 août 2013
8
Merci pour ces nouvelles indications :)
Je pense quelles me seront sans doute utiles dans un prochain prog :)

Une dernière question rapide (des réponses oui ou non suffiront ;)) qui n'a pas grand chose à voir avec le post de départ: est -il possible de porter un prog delphi vers mac (sous delphi ? ou autrement ?)

Bonne soirée à tous