Exe, procedure, ou fonction orpheline :delphi

Résolu/Fermé
MisterGé Messages postés 116 Date d'inscription samedi 19 février 2011 Statut Membre Dernière intervention 3 août 2013 - 18 sept. 2011 à 11:51
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 27 sept. 2011 à 07:34
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.



A voir également:

9 réponses

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
27 sept. 2011 à 07:34
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
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
18 sept. 2011 à 12:23
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...
1
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
19 sept. 2011 à 20:36
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...
1
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
19 sept. 2011 à 21:32
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...
1

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

Posez votre question
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
21 sept. 2011 à 20:48
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...
1
MisterGé Messages postés 116 Date d'inscription samedi 19 février 2011 Statut Membre Dernière intervention 3 août 2013 8
19 sept. 2011 à 19:44
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.
0
MisterGé Messages postés 116 Date d'inscription samedi 19 février 2011 Statut Membre Dernière intervention 3 août 2013 8
21 sept. 2011 à 20:19
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 :)
0
Heremion Messages postés 538 Date d'inscription vendredi 20 mai 2011 Statut Membre Dernière intervention 1 juin 2022 102
26 sept. 2011 à 14:30
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.
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
26 sept. 2011 à 17:06
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...
0
MisterGé Messages postés 116 Date d'inscription samedi 19 février 2011 Statut Membre Dernière intervention 3 août 2013 8
27 sept. 2011 à 01:00
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
0