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 :

Plusieurs threads, un seul fichier


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Par défaut Plusieurs threads, un seul fichier
    Bonjour

    Je voudrais savoir si l'est techniquement possible d'avoir par exemple 10 threads travaillant sur le même handle de fichier.

    On aurait en fait une seule variable f : file qui correspondrait au fichier à ouvrir (en lecture uniquement) et des threads qui utiliseraient ce handle pour lire le fichier mais à des positions différentes avec Seek(f, (position propre au thread) ), puis BlockRead(f,...)

    N'y a-til pas un risque que le thread 1 lise le fichier mais à la position d'un autre thread ?

    Faudrait-il alors créer autant de handles (f : array of file) qu'il y a de threads ?

    Quelqu'un a-til déjà traité du multithreading sur un seul fichier ?

    Merci pour vos idées

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Effectivement, sans section critique, tu pourras avoir deux threads qui utilise Seek et se pertube mutuellement

    Thread A Seek sur 100
    Thread B Seek sur 200
    Thread B Read sur 200 à 250
    Thread C Seek sur 400
    Thread A Read sur théoriquement 100 à 170 mais en réalité sur 400 à 475
    Thread C Read sur théoriquement 400 à 500 mais en réalité sur 475 à 575

    Donc soit un seul Handle avec une TCriticalSection protégeant contre le multi-Thread
    Sinon utilise plusieurs TFileStream en lecture seule non exclusive, un par thread !
    le Handle ou le TFileStream est un membre privé du Thread, n'utilise pas un tableau commun,
    car lui aussi faudrait le protéger par une Section Critique pour gérer les Instanciations/Libérations

    Personnellement, je l'ai fait, il y a des années mais en écriture, sans le faire vraiment exprès,
    c'était une fonction qui écrivait dans un fichier log qui était utilisé un peu partout
    Aujourd'hui, j'utilise plutôt une DB ou le journal Windows pour mes logs (et en cas d'ultime plantage de la DB, le fichier local)
    Pour la version de Débogage, c'est un fichier local au lieu du journal Windows (lui semble parfaitement threadsafe)
    j'ai au deux threads qui l'utilise en écriture, environ 10 écritures par seconde, j'ai parfois 2 écritures à la même milli-secondes
    Par contre, même si cela ne plante pas, j'ai noté quelques très très rares chevauchements d'écriture (une ligne qui en a écrasé partiellement une autre)

    Par contre, j'ai déjà fait de la lecture par plusieurs processus,
    et je ne crois pas que cela change grand chose entre plusieurs processus ou plusieurs threads (si ces derniers sont correctement isolés)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Par défaut
    Effectivement, j'avais un gros doute sur le tableau de handles aussi ; reste la solution au sein de chaque thread comme celle que tu proposes :

    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon utilise plusieurs TFileStream en lecture seule non exclusive, un par thread !
    le Handle ou le TFileStream est un membre privé du Thread
    Merci pour ta réponse

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Et pourquoi pas une file de messages protégée en écriture, sur le principe Consommateur/ Producteurs

    Et ensuite le thread [fil d'exécution] "Consommateur" va écrire soit par lots (tous les X messages) (*) soit message par message.


    * -> En cas de crashs il va y avoir des manques

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Et pourquoi pas l'inverse : un thread principal pour la gestion du fichier (BlockRead compris) et des threads secondaires qui ne font que traiter les buffers (résultats des BlockRead). Ainsi plus besoin de synchro puisque plus d'accès concurrent

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 932
    Billets dans le blog
    6
    Par défaut
    Si la taille du fichier le permet, pourquoi ne pas utiliser un TMemoryStream pour ouvrir le fichier en mémoire, et des descendants de TMemoryStream héritant chacun de la zone mémoire du premier, pour de la lecture uniquement (style TSharedMemoryStream) ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Associer plusieurs xsd à un seul fichier xml
    Par Hannah023 dans le forum Valider
    Réponses: 5
    Dernier message: 24/08/2010, 18h35
  2. Réponses: 3
    Dernier message: 07/01/2007, 16h48
  3. exporter cellules de plusieurs fichiers sur un seul fichier
    Par sapeur37 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/11/2006, 09h46
  4. Réponses: 7
    Dernier message: 16/05/2006, 13h04
  5. RS232: Un seul ou plusieurs threads?
    Par cfalcot dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 01/04/2006, 23h01

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