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

Composants FMX Delphi Discussion :

TBitmap, CreateAnonymousThread et migraines


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club Avatar de DavidTH
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut TBitmap, CreateAnonymousThread et migraines
    Hello les pros

    J'essaie de gérer correctement la manipulation de bitmaps en dehors du main thread, mais je me heurte à des bugs que j'ai du mal à comprendre.
    Ancien accro au Application.processmessages (pas taper), j'essaie de me soigner.

    Comme je découvre le multithreading, je souhaite démarrer simple. Mon but est principalement de ne pas bloquer l'UI pendant des traitements longs de bitmaps et potentiellement de paralléliser quelques routines.

    La solution que j'utilise est toute bête :
    • Je crée un Anonymous thread
    • Je crée mon Tbitmap
    • Je modifie le bitmap dans le AnonymousThread
    • Si j'ai besoin d'accéder à un élément de l'UI, je fais un TThread.Synchronize
    • Si je dois utiliser le TCanvas de mon bitmap, je fais aussi un TThread.Synchronize (j'ai lu que le canvas d'un bitmap n'est pas threadsafe)

    Sur Windows, tout fonctionne bien, à l'exception d'un CopyFromBitmap qui plante mon appli si je le mets à l'intérieur d'un TThread.Synchronize...
    Sur MacOS, ça marche aussi sur certaines versions, mais ça plante sur Ventura (l'UI est lente, les images ne s'affichent pas toujours et au final l'appli se freeze).

    Avez-vous des idées sur la meilleure manière de travailler sur des bitmaps dans un autre thread que le thread principal ?

    Cordialement,

    David

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 964
    Par défaut
    Pas sûr que synchronize soit utile. Il faudrait plutôt verrouiller le canvas.

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    attention à la notion de "Thread Safe", un code qui n'est pas "ThreadSafe" ne veux pas dire qu'on ne peut pas l'utiliser dans UN thread, mais qu'on ne peux pas l'utiliser dans PLUSIEURS thread en même temps

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      i: Integer;
    function GetNextI: Integer;
    begin
      Inc(I);
      Result := I;
    end;
    le code ci-dessus n'est pas ThreadSafe, mais si je ne l'utilise que dans un seul thread secondaire, il fonctionnera parfaitement.

    à vérifier, mais je ne suis pas certain que le Canvas d'un bitmap créé dans un Thread ne puisse être utilisé dans ce même thread.


    oups...on dirait que ça coince parfois quand même
    https://quality.embarcadero.com/browse/RSP-26499
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre du Club Avatar de DavidTH
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    attention à la notion de "Thread Safe", un code qui n'est pas "ThreadSafe" ne veux pas dire qu'on ne peut pas l'utiliser dans UN thread, mais qu'on ne peux pas l'utiliser dans PLUSIEURS thread en même temps

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      i: Integer;
    function GetNextI: Integer;
    begin
      Inc(I);
      Result := I;
    end;
    le code ci-dessus n'est pas ThreadSafe, mais si je ne l'utilise que dans un seul thread secondaire, il fonctionnera parfaitement.

    à vérifier, mais je ne suis pas certain que le Canvas d'un bitmap créé dans un Thread ne puisse être utilisé dans ce même thread.


    oups...on dirait que ça coince parfois quand même
    https://quality.embarcadero.com/browse/RSP-26499
    Intéressant, merci ! J'en apprends tous les jours

    Mais du coup, si je comprends bien, comme je n'ai que le Main thread et mon Anonymous thread, l'utilisation de Synchronize devrait m'éviter les conflits sur le Canvas ?
    En parallèle (ah ah), comme évoqué au-dessus, je vais aussi faire des tests avec Canvas.lock.

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Synchronize c'est juste une méthode qui suspend l'exécution du thread en attendant que la méthode en paramètre soit exécutée par le thread principal quand il en aura le temps.
    du coup on a un thread secondaire qui attends, et un thread principal que ne fait rien d'autre (vu qu'il est occupé à faire cette procédure) et donc aucun risque de conflit (sauf si un autre thread venait à bidouiller les choses sans passer par Syncrhonize aussi).

    c'est nécessaire à chaque fois que le code invoqué n'est pas ThreadSafe d'une part, et qu'il est potentiellement appelé par un autre thread (dont le principal)...c'est le cas de la manipulation de tout ce qui constitue l'interface utilisateur qui peut être manipulé à tout moment par la souris, le clavier, un timer...il est donc interdit de le faire ailleurs que dans le thread principal.

    concernant les bitmap, je viens de trouver l'explication, TCanvasD2D.CreateFromBitmap utilise TMessageManager.DefaultManager qui lui-même n'est pas thread-safe....à priori les versions GPU et Mac ne présentent pas la même faiblesse ceci dit.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre du Club Avatar de DavidTH
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Pas sûr que synchronize soit utile. Il faudrait plutôt verrouiller le canvas.
    Merci pour l'info, je n'avais pas encore utilisé le canvas.lock. Je vais tester cela !

Discussions similaires

  1. Ambiguity between 'TBitmap' and 'Windows::TBitmap' ???
    Par scifire dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2005, 13h44
  2. [TBitmap] Recuperer la couleur d un pixel
    Par DamessS dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/12/2004, 09h47
  3. effacer une image chargée ds TBitmap
    Par sony351 dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/09/2004, 11h28
  4. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 14h39
  5. tbitmap.free dans une function
    Par portu dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2003, 23h08

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