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

Langage Delphi Discussion :

Multithread et liste de tâches


Sujet :

Langage Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut Multithread et liste de tâches
    Bonjour,

    J'ai un problème... je vous explique...

    Mon programme lance plusieurs threads pour télécharger une liste de pages web, les analyser et extraire les données qui m'intéressent... jusque là tout va bien.
    Une fois que j'ai ces données, je souhaite les stocker dans une base de données SQLite3. Je ne peux malheureusement pas le faire simultanément depuis chaque thread (pas d'accès concurrents), donc pour l'instant je fais un simple Synchronize(UpdateDB) dans mes threads, et ça semble fonctionner.
    Mais pour éviter de bloquer mes threads chaque fois que j'arrive sur un Synchronize, j'aimerais à la place créer une espèce de liste de tâches: permettre à chaque thread d'ajouter une tâche à la liste avec en paramètre les données recueillies, et de passer à autre chose au lieu d'attendre que la mise à jour de la BDD ait eu lieu.

    Ma première question est: est-ce que c'est possible ? Si oui, auriez-vous des pistes ? (Si j'ai bien compris OmniThreadLibrary aurait peut-être pu m'aider ? mais j'utilise D7 donc de toutes façons cette solution est exclue :-\ )

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Stocke les données dans un objet
    Ajoute cet objet dans une ThreadList
    Les Threads ajouteront tous dans la ThreadList
    Un Seul thread utilisera la DB et ira lire les données insérées dans la ThreadList utilisée comme une FIFO

    Il y a aussi Classes.TThread.Queue, cela semble fonctionner comme Synchronize, tu lui passe une méthode mais il n'attend pas, il l'a met en file d'attente et reprendre ton thread directement

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Ok je vais me renseigner sur ThreadList...

    Queue n'existe pas chez moi, je pense que ça a été introduit après D7 ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Ok je vais me renseigner sur ThreadList...
    Je l'ai massivement utilisé en D5 à D7, c'est très efficace, juste faut être habitué au pointeur (allocation et libération, être soigneux à ce sujet)

    Citation Envoyé par GoustiFruit Voir le message
    Queue n'existe pas chez moi, je pense que ça a été introduit après D7 ?
    En D7, cela ne devait pas exister, mon C++Builder 2007 possède ce fonction, on peut penser que son apparition date de cette version

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Si je comprends bien, TThreadList me permet juste d'ajouter des objets depuis mes différents threads (producteurs) à une liste... mais je dois encore créer un thread supplémentaire (consommateur) chargé de l'insertion dans la BDD qui devra surveiller les changements (ou en être averti) dans le tthreadlist ?

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    C'est l'idée, le thread consommateur pouvant être un TTimer dans le Thread Principal, ou utiliser Application.OnIdle (c'est à ce moment qu'est lancé le Synchronize, si je ne m'abuse !)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    J'ai trouvé ceci sur le net, ça me semble aller dans le bon sens...
    http://www.delphi3000.com/articles/article_3869.asp
    L'exemple semble correspondre à ce que je veux faire (To allow multiple threads to asynchronously write to a log file), il me reste le plus compliqué à faire: comprendre comment ça marche !

Discussions similaires

  1. comment cacher une application de la liste des tâches ?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 2
    Dernier message: 22/12/2004, 17h12

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