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 :

Équivalent FMX à WaitForMultipleObjects


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 871
    Points : 1 247
    Points
    1 247
    Par défaut Équivalent FMX à WaitForMultipleObjects
    Bonjour,

    Dans un prog multithreads sous Windows avec la VCL, pour attendre la fin de tout les threads de mon spoiler, j’utilise : WaitForMultipleObjects.

    Je cherche à porter ce prog sous FMX, de ce fait, je me trouve coincé par cette API spécifique à Windows, à votre avis, existe-t’il un équivalent multiplateforme ou une autre approche pour y arriver ?

    Merci d’avance de vos suggestions.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 704
    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 704
    Points : 25 574
    Points
    25 574
    Par défaut
    Tu peux utiliser un TEvent et un AtomicIncrement\Decrement

    Cherche dans le code WaitForMultipleObjects, si cela se trouve tu tomberas dessus dans une encapsulation FMX, il ne semble qu'il n'y a rien de natif ailleurs qu'un polling


    Tu peux aussi repenser totalement ta logique avec tu TTask et TParallel

  3. #3
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 871
    Points : 1 247
    Points
    1 247
    Par défaut
    Merci pour ton retour, c’est vrai qu’avec TTask, on a WaitForAll et WaitForAny

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 704
    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 704
    Points : 25 574
    Points
    25 574
    Par défaut
    Et si l'on regarde le code du WaitForAll, sans suprise si l'on part du TCountdownEvent utilisant du TInterlocked mixé à un TLightweightEvent (encapsulant de TMonitor) ... donc tout ça c'est du AtomicCmpExchange qui reste la clé de base pour gérer les verrous d'attente de thread.

    Il faut aussi regarder les implémentations de TMultiWaitEvent, sa fonction Create n'est pas un constructor mais une factory sur l'une des implémentations RTL
    Dès que tu intègres les unités contenant TTask ou TCriticalSection au projet, l'implémentation change et je ne vois pas un développeur s'intéressant au multi-thread ne pas inclure System.SyncObjs (je me demande même pourquoi il en existe une autre variante)

    Les développeurs Delphi ont beaucoup travaillé sur ce genre de classe, c'est tout un art, ceux qui ont connu le TMultiReadExclusiveWriteSynchronizer en Delphi 7, il était loin d'être au point lors des promotions de verrou de lecture vers verrou d'écriture, il a bien fallu dix ans avec XE2 pour je lui offre une nouvelle chance (a priori plus de DeadLock mais j'évite aussi de créer cette situation en utilisant systématiquement un rééchantillonage plutôt qu'une promotion directe)

  5. #5
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 871
    Points : 1 247
    Points
    1 247
    Par défaut
    Avec le mot « rééchantillonage », là, j’avoue que tu m’as perdu !

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 704
    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 704
    Points : 25 574
    Points
    25 574
    Par défaut
    Dans un contexte mutli-read, tu vas lire la valeur, et dans quelques RARES fois, tu voudras la modifier.

    L'idée est de faire

    Code Algo : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BeginRead
      Value = Read
    EndRead
     
    Check Special Value
      BeginWrite 
        Value = Read // Ré-échantillonage
        Check Special Value
          Write
      EndWrite

    Tu penses qu'entre les deux verrous, il y a une faible chance que la modification soit produite par un autre thread, donc tu vérifies que ce n'est pas le cas.

    C'est bien moins dangereux que de faire BeginRead BeginWrite EndWrite EndRead qui d'ailleurs à mon avis doit être limite absurde mais l'imbrication d'un code peut amener à cela sans que cela soit visible dans le code mais uniquement à l'exécution par des appels de fonctions successifs


    Tu peux prendre le risque même de lire dans certains cas, je pense au Singleton que tu veux rendre Thread Safe : voir class function TSLTSingletonThreadSafe<T>.GetThreadSafeInstance(): T;
    Je sais qu'il n'y aura qu'une seule et unique première écriture, donc je peux me passer totalement de verrou de lecture, si c'est assigné, c'est fini, sinon, verrou, vérification que c'est toujours non assigné (oui probabilité infime mais existante) et allocation si nécessaire.

  7. #7
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 871
    Points : 1 247
    Points
    1 247
    Par défaut
    , parfaitement expliqué !

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

Discussions similaires

  1. exécution de fichier à extension .fmx
    Par hrezzaz dans le forum Oracle
    Réponses: 4
    Dernier message: 05/03/2006, 16h37
  2. WaitForMultipleObjects
    Par el3gans dans le forum Windows
    Réponses: 4
    Dernier message: 20/02/2006, 13h34
  3. Réponses: 2
    Dernier message: 17/10/2005, 19h55
  4. Réponses: 1
    Dernier message: 12/10/2005, 11h11
  5. Lancement d'une form *.fmx [FORMS 10g]
    Par oramine dans le forum Forms
    Réponses: 8
    Dernier message: 03/10/2005, 13h10

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