IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

[Algorithme] Copie liste de fichiers avec 10 threads


Sujet :

Delphi

  1. #21
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par Eric Boisvert
    Dans la solution que tu propose, Ce qui me chagrine un peu, c'est le besoin d'utiliser un timer, et l'obligation de chercher un thread libre..etc.
    Moi aussi. Je trouve l'utilisation d'un timer inapproprié. C'est pour cette raison que j'ai demandé votre aide. Tu m'as convaincu, je vais étudier la question de la TThreadList.

    Simplement, il faut que vous sachiez que je ne termine pas les threads, je les suspend parce que la création d'un thread crée aussi l'objet Http et que les requêtes Http sont nécessaires pendant toute l'exécution du programme (d'autres fonctions que la copie peuvent être demandées). L'evénement de fin de requête met en pause le thread jusqu'à qu'une nouvelle requête le redémarre. Par exemple, si l'application n'utilise que 2 threads, seulement 2 threads seront créés et si elle utilise les 10, les 10 seront créés et détruis à la fermeture du programme via FreeOnTerminate := True;

    Ça peut vous sembler bizarre, mais je n'ai pas vraiment besoin de détruire l'objet thread et son objet Http pour devoir le recréer...Cela consomme un peu plus de mémoire, certe, mais en contre partie, je gagne du temps en évitant la destruction et recréation de l'objet. C'est peut-être aussi l'avantage d'utiliser une TThreadList : On ne détruit pas le thread jusqu'à qu'on en ait plus besoin, non?

    Mais dans tous les cas, nous sommes bien d'accord sur un point : Ce sera le thread principal qui se chargera de distribuer les fichiers de la liste aux threads de copie libres. TThreadList me semble être une solution très intérressante et performante, mais puis-je l'utiliser sachant que je ne détruis pas les threads ? Le sémaphore ne serait-il pas un choix plus judicieux ?
    De retour parmis vous après 10 ans!!

  2. #22
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par Sub0
    si l'application n'utilise que 2 threads, seulement 2 threads seront créés et si elle utilise les 10, les 10 seront créés et détruis à la fermeture du programme via FreeOnTerminate := True;
    C'est exactement ce que je voyais
    Citation Envoyé par Sub0
    TThreadList me semble être une solution très intérressante et performante, mais puis-je l'utiliser sachant que je ne détruis pas les threads ?
    Absolument.
    Citation Envoyé par Sub0
    il faut que vous sachiez que je ne termine pas les threads, je les suspend
    Alors là, faudrait pas les suspendre.. c'est eux-mêmes qui vont hiberné en
    attendant quelque chose à faire...avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        //ici on attend des nouvelles données cette boucle prend 0% cpu!
        while (WaitForSingleObject(MyThreadListFile.NewData,1000)=WAIT_TIMEOUT do
        begin
            if Terminated then break;
        end;
    Citation Envoyé par Sub0
    Ce sera le thread principal qui se chargera de distribuer les fichiers de la liste aux threads de copie libres
    Si tu utilise la mon charabia, je dirais non. C'est plutôt la TThreadList qui réveillera les Thread de copie...et eux.. qui vont ce chercher du travail à faire...et en cas de... rien à faire... on attend...

    De mémoire, cette facon de dormir ressemble drôlement à une bonne vieille
    boucle de message windows finalement...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  3. #23
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Alors là, faudrait pas les suspendre.. c'est eux-mêmes qui vont hiberné en
    attendant quelque chose à faire...
    Un détail peut-être important pour le choix de la solution appropriée : L'upload Http ne peut-être réalisé en une seule fois, à cause de la limitation de 2Mo du serveur. Aussi, le fichier à copier est ouvert dans un TStream, et envoyé par blocs de 2Mo. En résumé, un thread pour une requête, plusieurs requêtes pour un fichier, plusieurs fichiers dans la liste... Mais je ne pense pas que ça change grand chose, le principe reste le même : Il s'agit de transférer des données, mêmes si le fichier est envoyé en plusieurs fois.
    De retour parmis vous après 10 ans!!

  4. #24
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par Sub0
    un thread pour une requête, plusieurs requêtes pour un fichier
    c'est nouveau ca? J'ai peut-être manqué un bout quelque part?

    J'aivais cru que ta mécaniques pour copier un fichier était
    1 thread= 1 fichier...

    Là j'avoue que je suis un peu embêté...

    vite vite, je dirais que la liste de fichier dans le TThreadList devient un liste de morceaux de 2mo?

    Tu as déjà un gestion de morceaux vs fichier j'imagine...?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  5. #25
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par Sub0
    un thread pour une requête, plusieurs requêtes pour un fichier
    Excuse moi, j'ai dis une bétise là.
    vite vite, je dirais que la liste de fichier dans le TThreadList devient un liste de morceaux de 2mo?
    Non, en fait, pour le moment, je découpe et envoi le fichier dans une boucle dans la procédure Execute du thread. Mais ça revient au même puisque c'est le même thread qui s'occupe d'un fichier. Chaque thread s'occupera de scinder et d'envoyer son fichier... A noter que les fichiers ne sont scinder que si ils ont une taille supérieure à 2Mo.

    Le fait qu'il y ait une boucle de copie dans le thread ne dérange pas, c'est comme si on faisait une simple copie de fichier avec BlockRead / BlockWrite. Je détaille un peu la boucle : Chaque itération va copier un bloc dans le TFileStream et effectuer la requête Http. Puis la boucle attend une réponse du serveur pour continuer ou s'interrompre.
    De retour parmis vous après 10 ans!!

  6. #26
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Bon, alors je crois que ca vaut la peine d'essayer les TThreadList comme une
    fifo de nom de fichier à copier.

    Pour ma part, j'ai utilisé ce principe (enfin presque identique)
    dans un MSN home made pour envoyer un message à plusieurs personnes...

    Donc sur la portion serveur, j'avais 1 Thread = 1 personne/socket
    et ma TThreatListe était une fifo de Messages destinés à quelqu'un...

    Ca roule encore 24/24 7/7 avec 40 clients sans problème sur un PIII-800Mhz 512MRam.

    Je vois difficilement pourquoi ca ne fonctionnerais dans ton cas pour copier
    des fichiers.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  7. #27
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Pour résumé le topic, je peux soit utiliser un sémaphore soit une TThreadList. Je vais dans un premier temps essayer de faire une petite démo avec une TThreadList et la fonction CopyFile pour bien comprendre le mécanisme et ne pas me mélanger les pinceaux. J'espère ne pas y passer 3 jours...

    En tous les cas, merci à tous pour votre participation!
    De retour parmis vous après 10 ans!!

  8. #28
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    J'ai réuni l'essentiel ici pour créer une fifo Thread-Safe avec Event.
    ca peut-être utile à quelqu'un...

    Peut-être même à toi Sub0 pour ta démo.
    Fichiers attachés Fichiers attachés
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  9. #29
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Merci Eric! En fait, le TThreadList semble être exactement ce que je recherchais. Le sémaphore est aussi une solution très intérressante. Encore merci, grâce à vous, je progresse! Je posterai bientôt la suite dans ce topic. à+
    De retour parmis vous après 10 ans!!

  10. #30
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Arf! Que ce soit avec le sémaphore ou la TThreadList, je ne vois pas comment je peux l'intégrer dans mon code. J'ai beau lire l'article de la Faq concernant le sémaphore ou étudier le code d'Eric, je n'y pige rien.

    J'ai déjà réalisé une fonction de copie avec Blockread/BlockWrite et qui affiche la progression et le temps restant :
    http://sub0.developpez.com/delphi/mycopy.zip

    Comment dois-je faire pour préparer une dizaine de thread et afficher la progression et le temps restant pour l'ensemble des copies lancées ?
    Et comment utiliser la TThreadList pour distribuer les fichiers ?
    J'ai pas le niveau...
    De retour parmis vous après 10 ans!!

  11. #31
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Voilà Sub0,
    Ma démo pour Copier des fichiers en multi-thread, avec feed back, etc...

    Tu remarquera que j'utilise en faite 2 TThreadList (Fifo Thread-Safe)
    Une pour la liste des fichiers à copier
    une pour le feedback...

    ca devrait te permettre de créer une adaptation pour ton prog...

    Bonne Chance!

    PS: Je vais bientôt manquer de place... j'atteind presque ma l'imite de fichier
    attaché....quelqu'un peut-il arranger ca?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  12. #32
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Un grand merci à toi Eric! J'en espèrais pas tant.
    Cet aprèm, j'ai travaillé dessus et j'ai finalement vraiment simplifié les choses :
    • Pas de timer cette fois-ci, juste une TStringList dans laquelle j'ajoute les fichiers
    • Tout de suite après ce OpenDialog, je lance les threads de copie jusqu'à que tous les threads libres soient pris ou qu'il n'y ait plus de fichiers dans la liste
    • Je met une chaîne vide à la place du nom de fichier pour signifier que sa copie est effectuée
    • Lorsqu'un thread a terminé la copie, il regarde si il reste des fichiers à copier
    • Lorsqu'il n'y a plus de fichier à copier, je vide la liste

    Mais maintenant, avec ta démo, je pense que je pourrais y arriver.

    ps: Veux-tu proposer ton code pour la page source de Delphi ?
    De retour parmis vous après 10 ans!!

  13. #33
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Et comment fais-tu ton Feed-Back de la copie avec le thread Principal?
    Synchronize? C'est pas évidant de travailler avec ca non?


    Citation Envoyé par Sub0
    Mais maintenant, avec ta démo, je pense que je pourrais y arriver.
    Ca j'en suis certain! Jette un coup d'oeil... c'est pas si sorcier...

    Citation Envoyé par Sub0
    ps: Veux-tu proposer ton code pour la page source de Delphi ?
    Je veux bien... mais faudrait la documenter un peu mieux...
    Comment je procède pour la soumettre?

    Citation Envoyé par Eric Boisvert
    PS: Je vais bientôt manquer de place... j'atteind presque ma l'imite de fichier
    attaché....quelqu'un peut-il arranger ca?
    Est-ce que tu sais si il y a quelque chose à faire pour ca?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  14. #34
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par Eric Boisvert
    Et comment fais-tu ton Feed-Back de la copie avec le thread Principal?
    J'avoue, j'ai pas encore bien saisi ce qu'était un Feed-back. Je vais tout de même essayer de te répondre; La copie est une boucle qui se trouve dans la procédure Execute du thread. A chaque itération, j'envoi un bloc de données de 2Mo max au serveur. L'objet Http possède un evénement OnRequestDone dans lequel je vérifie la réception des données. Là aussi, j'affiche la progression et je peux décider de poursuivre la copie ou d'en reprendre une nouvelle... Cela répond-t-il à ta question ou je suis hors sujet ?

    Citation Envoyé par Eric Boisvert
    Synchronize?
    Synchronize me sert à faire une pause dans le thread, le temps d'afficher la progression, un message d'erreur ou poser la question d'écrasement de fichiers...

    Citation Envoyé par Eric Boisvert
    C'est pas évidant de travailler avec ca non?
    Faut aussi avouer que dans l'ensemble, les threads, la TThreadList ou le sémaphore ne sont pas évidents non plus...
    Mais bon, j'imagine que tu connais mieux que moi le sujet.

    Citation Envoyé par Eric Boisvert
    Ca j'en suis certain! Jette un coup d'oeil... c'est pas si sorcier...
    Ça fait beaucoups de code qu'en même et j'ai encore du mal à saisir certaines choses... Je cherche également à bien comprendre les avantages du concept par rapport à la méthode que j'ai utilisé cet aprem. En tous les cas, ça marche plutôt bien la TThreadList.

    Citation Envoyé par Eric Boisvert
    Je veux bien... mais faudrait la documenter un peu mieux...
    Comment je procède pour la soumettre?
    En effet, il faudrait, pour bien faire, commenter un peu plus et en Français. Je pense aussi qu'il faudrait coder la copie dans une boucle avec TFileStream ou BlockRead/BlockWrite. Sinon, rien à redire sur cette démo. Je pense que c'est un bon cas d'école. Pour la soumettre, poste un nouveau sujet dans le sous-forum FAQ/Sources de Delphi.


    Citation Envoyé par Eric Boisvert
    Est-ce que tu sais si il y a quelque chose à faire pour ca?
    Je ne savais même pas qu'il y avait une limitation sur les pièces jointes. Je les utilise très rarement, je préfère de loin mettre mes archives sur mon site et donner un lien. De cette manière, je peux toujours modifier le code sans devoir éditer le message si je m'apperçois d'une erreur ou d'un bug. Je peux aussi le donner dans d'autres posts sans l'attacher à nouveau. Peut-être devrais-tu voir ce sujet :

    http://developpez.net/forums/showthread.php?t=157450
    De retour parmis vous après 10 ans!!

  15. #35
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai codé une démo avec la méthode que j'ai utilisé cet aprem en essayant de refaire le même programme que toi sauf que j'ai ajouté la copie dans une boucle (TFileStream). Le programme fonctionne chez moi sauf qu'il ne faut pas oublier de désactiver le déboggage intégré pour que les exceptions fonctionnent correctement si on lance l'exécution à partir de l'EDI. Bref, tu remarqueras surtout la taille du code...

    Citation Envoyé par Eric Boisvert
    C'est pas évidant de travailler avec ca non?
    A toi de juger à présent.
    J'attend avec impatience tes impressions.

    http://sub0.developpez.com/delphi/threadscopy.zip
    De retour parmis vous après 10 ans!!

  16. #36
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par Sub0
    J'avoue, j'ai pas encore bien saisi ce qu'était un Feed-back.
    Juste en passant, j'utilise le mot Feedback ce qui correspond selon moi à donner la progression à l'usager.
    (c'est une traduction libre biensûr!)


    Citation Envoyé par Sub0
    J'attend avec impatience tes impressions.
    Et bien les voilà:

    1- La destruction des Threads en mode automatique (FreeOnTerminate := True) peut ce faire à la seule condition
    que le thread puissent sortir de la boucle Execute. On a donc un petit problème ici à corriger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Procedure TForm1.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
    Var i: Integer;
    Begin
      For i := 0 To NbrThreads - 1 Do Begin
        //MyThreads[i].Suspend;   // à enlever pour les raisons suivante: 
        MyThreads[i].Terminate; //Le thread est suspendu donc appeler Terminate
                                //ne servait à rien et le thread n'était pas détruit.
        MyThreads[i].Suspended := False; //Active le thread (on doit le laisser terminer!)
        MyThreads[i].WaitFor;   //Attend la sortie du Thread
      End;
     
      CanClose := True;
    End;
    2- Si on quitte pendant une copie en cours, la boucle de copie ne verifie pas si Terminated=TRUE.
    On devra alors attendre la fin de la copie avant de quitter l'application...
    Et c'est probablement pas ce que l'on souhaite!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Dans Procedure TMyThread.Execute;
    Repeat
      p := s.Position;
      s.Read(Buf, Length(Buf));
      d.Write(Buf, s.Position - p);
      Synchronize(UpdateView);
      if Terminated then break; //(À Ajouter) Si Terminate, on doit Quitter!
    Until (d.Size >= s.Size) Or (s.Position - p <> Length(Buf));]
    3- Lorsque tu ajoute des fichiers dans la liste, tu n'a pas besoin d'arrêter les threads en cours
    car la selection de nouveau fichier se fait à l'aide de Synchronize. Donc impossible que tu
    soit en ajout de fichier pendant qu'un thread en prend un.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //dans TForm1.AjouterClick(Sender: TObject);
    //{ Pause des threads }
    //  For i := 0 To NbrThreads - 1 Do
    //    MyThreads[i].Suspended := True;	
    // Inutile car les threads sont en synchronize pour piger dans la liste!
    4- Le fait d'utiliser Synchronize, (preuve pour #3 aussi) détruit un peu le multi-Thread.
    Un simple F1 sur Synchronize t'expliquera d'avantage que moi la source du problème...
    Pour en faire la preuve, réduit à 2 thread ton application, et effectue une copie de 3-4 gros fichiers et pendant le download en cours, appuie sur ce bouton qui inclus ce code bidon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
        i:integer;
    begin
        //Simulation d'un Long calcules de 30 sec.
        Application.
        for i:=0 to 3000 do
        begin
            sleep(10);
        end;
    end;
    Et oui , les threads ont arrêté de copier...Ils étaient en arrêt dans Synchronize(UpdateView)
    car ton application principale était occupée...
    Il est claire qu'ici, ce n'est peut-être pas un gros problème...Le synchronise
    devient pratique
    surtout lorsque le thread veut absolument une réponse de l'usager par exemple...
    Dans d'autre cas, on ne voudrait absolument pas ralentire un gros calcule
    par exemple pour des raisons de feedback...C'est bien là que la Fifo Thread-Safe intervient.

    Citation Envoyé par Sub0
    Bref, tu remarqueras surtout la taille du code...
    C'est Simple, court et éfficace dans ce contexte. C'est du Sub0 quoi!


    Bref...C'était bien intéressant tout ca...

    Je serais bien curieux de voir l'attaque de ce problème avec les Semaphores...
    Si quelqu'un les connait bien...ce serait intéressant de voir de quelle façon
    une démo semblable à la nôtre peut-être écrite en les utilisant?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  17. #37
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Tes remarques sont très intérressantes. Juste rencontré un ptit problème : J'ai modifié le code comme tu me l'as dis pour le OnCloseQuery, et j'ai un bug : Exception EOSError code 6 sur le WaitFor j'ai l'impression...
    De retour parmis vous après 10 ans!!

  18. #38
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Rien à faire j'arrive pas à reproduire ce problème ici...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  19. #39
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Avec quelle version de Delphi tu travail?

    avec la 7 il y a ceci:
    Bug
    ca s'applique aussi avec d'autre version Delphi je crois bien..
    Moi ici D5...voici le code de TThread.Destroy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    destructor TThread.Destroy;
    begin
      if not FFinished and not Suspended then
      begin
        Terminate;
        WaitFor;
      end;
      if FHandle <> 0 then CloseHandle(FHandle);
      inherited Destroy;
      RemoveThread;
    end;
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  20. #40
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai Delphi6. J'ai essayé toutes les directives de compilation possibles au cas où, j'ai toujours le problème avec WaitFor : Descripteur non valide (code 6). J'ai fait une petite recherche à ce sujet et j'ai trouvé la solution :
    Citation Envoyé par Smortex
    FreeOnTerminate := False;
    J'ai donc modifié mon code et profité pour corriger un autre bug aussi. Grâce à ton expérience et tes explications, le code doit-être correcte à présent :
    http://sub0.developpez.com/delphi/threadscopy.zip

    Citation Envoyé par Eric Boisvert
    Je serais bien curieux de voir l'attaque de ce problème avec les Semaphores... Si quelqu'un les connait bien...ce serait intéressant de voir de quelle façon une démo semblable à la nôtre peut-être écrite en les utilisant?
    +1.
    Je me demande aussi : N'y aurait-il pas moyen de simplifier ton code avec la TThreadList ?
    De retour parmis vous après 10 ans!!

Discussions similaires

  1. Copie d'un fichier avec des caractères spéciaux
    Par totofe dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 15/09/2010, 12h28
  2. Liste de fichiers avec liens et classement
    Par illidan05 dans le forum Excel
    Réponses: 1
    Dernier message: 21/05/2008, 14h48
  3. recuperer liste de fichier avec http
    Par etoileDesNeiges dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 10/04/2007, 12h02
  4. Réponses: 16
    Dernier message: 07/04/2005, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo