begin process at 2008 07 20 04:36:02
1 213 129 membres
50 nouveaux aujourd'hui
14 166 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LA DANSE DES AVATARS


Information sur la source

Catégorie :Graphique Classé sous : multithreading, animation, image, bmp, threading Niveau : Débutant Date de création : 12/12/2007 Date de mise à jour : 17/12/2007 19:48:34 Vu / téléchargé: 2 508 / 148

Note :
Aucune note

Commentaire sur cette source (28)
Ajouter un commentaire et/ou une note

Description

Bonjour à tous,

Just for the fun !

Après quelques heures de codage, le résultat n’est pas encore tout à fait…
Vous me direz..
Et ce n’est pas que je voulais faire au départ !

Le sujet est prétexte à l’utilisation du multi-threading,
Ce qui nous donnera l’occasion d’en débattre…

Et puis si ça se trouve, ce n’est pas la bonne méthode à utiliser ici…


Un peu en avance sur l’horaire :
Joyeux Noël à tous !

Cantador


NB : Le programme est assez long à décoller…
        J’utilise un composant externe : le TJvBallonHint de la suite JEDI
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

15 décembre 2007 12:45:54 :
Suppression des traces lors des déplacements des images.
17 décembre 2007 18:51:56 :
Un grand merci à cirec qui a réussi à régler les soucis de multi-threading améliorant du coup la fluidité et stoppant ainsi les pertes de mémoire (il a encore trouvé !) et merci aussi à caribensila qui a contribué à l'affichage des bulles.
17 décembre 2007 19:48:35 :
changement de capture..
  • signaler à un administrateur
    Commentaire de Caribensila le 12/12/2007 22:56:48

    :)))  Salut Cantador,

    Pas regardé en détail, mais 2 remarques sur le vif:

    - caribensilarond.bmp.... 18 382 octets
      Ca doit être la surprise des Kinder pour que je sois le plus lourd, non?

    - Compo externe: J'aime pas. T'aurais quand même pu nous faire une unité didactique en prime : "HintPerso" ;)

    Sinon, c'est un joli travail d'anthropologie.
    Pour le multi-threading, j'espère bien en apprendre bcp en lisant les commentaires.

  • signaler à un administrateur
    Commentaire de cantador le 13/12/2007 11:21:03

    Merci caribensila..

    Désolé, mais je n'ai pas réussi à faire fondre ton avatar...
    C'est peut-être un signe..Hummmmm
    Enfin, quand on voit la photo de WonderWoman publié par Francky23012301, tu as encore de la marge..

    Pour le HintPerso.. j'y ai bien pensé mais j'ai préféré tomber
    dans la facilité..

    Tu peux si tu le souhaites proposer qlqchose..

    Pour le Multi-threading, je suis aussi demandeur, mais ici,
    je me demande s'il n'aurait pas été préférable de créer un objet..

    A voir

    @bientôt

  • signaler à un administrateur
    Commentaire de cirec le 13/12/2007 11:44:13 administrateur CS

    Salut,

    @Caribensila:

    ton image est la plus lourde car c'est la seule que l'on peut ouvrir avec l'aperçu de windows, toutes les autres ne s'affiche pas (ça me rappel un truc ça ) je me demande avec quoi il les a fait enfin Delphi peut les lire c'est l'essentiel.

    @Cantador:
    J'ai testé ...  mais ça me parait bien long tout ça, les déplacements laisse des traces et je ne pense pas que c'était prévu !
    http://www.netimago.com/images/TyjPh2azK6FHsU4.jpg
    Il est impossible de quitter l'application avant la fin  des threads ... GrrRRrr ;)

  • signaler à un administrateur
    Commentaire de cantador le 13/12/2007 13:17:54

    Salut cirec,

    Pour info,les images ont été traitées avec GIMP..
    Les traces ben oui je sais..c'est pas top..
    Qt au "pas quitter avt la fin", çà c'est voulu car j'ai pas trouvé comment shinter les 10 threads en même temps !
    @+

  • signaler à un administrateur
    Commentaire de yvessimon le 14/12/2007 13:54:36

    Bonjour,

    Ou trouver TJvBallonHint de la suite JEDI

    ?

    Salutations

  • signaler à un administrateur
    Commentaire de cantador le 14/12/2007 16:19:24

    JCL:  http://jcl.sourceforge.net/daily/
    JVCL: http://jvcl.sourceforge.net/daily/

    ou sur le site de SOURCEFORGE..

    Le TjvBallonHint est dans la palette JV Non-Visual

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 12:51:29

    Voilà, j'ai supprimé les traces lors des déplacements des images.

    Reste encore l'affichage des bulles qui de temps en temps m'agace un peu..
    Si vous avec un bon PC, vous pouvez vous amuser à lancer plusieurs séries d'affilées...
    et là ca devient la Foire aux avatars !

  • signaler à un administrateur
    Commentaire de cirec le 15/12/2007 13:05:36 administrateur CS

    J'avais oublié un truc ...
    Change dans toutes les unités "Thread"  ceci :
          if Assigned(BitMap[x]) then
      BitMap[x].FreeImage;

    en :
         if Assigned(BitMap[x]) then
      BitMap[x].Free;          //  <<<<<<<<<<-------  

    Sinon tu as des fuites de mémoires ;-)

    je vais de ce pas voir ce que donne le nouveau code

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 13:27:19

    je te réponds de suite sans tester car j'avais écrit ça au début
    mais l'os est que la destruction complète de l'image marche effectivement (d'autant que l'éclatement de la bulle aurait pu permettre la production d'un son)
    Mais cela fonctionne une seule fois..et lors de création d'une seconde série,le prog plante car on détruit un objet qui n'existe plus..

    Mais finallement c'est peut-être le mieux:
    N'autoriser qu'une seule série

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 13:36:13

    @cirec:
    sur une deuxième série,avec free
    La violation d'accès se produit bien sûr tout à la fin lorsque tous les avatars s'endorment sur le plancher des vaches..

  • signaler à un administrateur
    Commentaire de cirec le 15/12/2007 15:04:41 administrateur CS

    Alors dans la procedure Debut rajoute ceci :

            Canvas.Draw(0, 0, Bitmap[i]); {Dessin du Bmp dans l'image}
            ShowHint := true;
          end;
          FreeAndNil(Bitmap[i]); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<-------------------
        end;
        LacherAvatar(false); {lancement des 10 threads}

    Et du coup tu peux même supprimer l'appel à Free dans les unités "Thread"
    Et l'application utilise moins de mémoire ;-)
    Et l'erreur est Normal ... puisque tu en faisant un Free l'objet en Question est toujours assigné pour le système,  (if Assigned(BitMap[x])  renvoie True tant que Bitmap[X] <> Nil)
    pour éviter ça il faut le mettre à Nil

    là j'ai pas le temps, mais dès que ... je me pencherais un peut plus sur le problème

  • signaler à un administrateur
    Commentaire de Caribensila le 15/12/2007 18:21:13

    Voici une petite unité pour créer des Hints ronds:


    unit RoundHintUnit;

    interface

    Uses
      Windows, Controls, Classes, Graphics, SysUtils;

    Type TRoundHint = Class( THintWindow )
      Private
        fBmp : TBitmap;
        procedure SetBmp(Image: TBitmap);
        Procedure Paint; override;
      Public
        Constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        property Image: TBitmap read fBmp write SetBmp;
      end;

    implementation

    {Un hint est une fenêtre Windows, et pour donner une forme particulière à une
    fenêtre, on utilise les Régions Windows.}

    Constructor TRoundHint.Create(AOwner: TComponent);
      begin
      Inherited Create(AOwner);
      fBmp := TBitmap.Create;
      try
        fBmp.Height := 100;
        fBmp.Width  := 100;
      except FreeAndNil(fBmp); end;
    end;

    destructor TRoundHint.Destroy;
      begin
      fBmp.Free;
      inherited;
    end;

    procedure TRoundHint.SetBmp(Image : TBitmap);
      begin
      fBmp := Image;
    end;


    Procedure TRoundHint.Paint;
      Var Rect      : TRect;
          Medaillon : HRgn;
      begin
      {ClientRect à été déterminé par la méthode CalcHintRect.}
      Rect := ClientRect;
      Medaillon := CreateEllipticRgnIndirect(Rect); //Création d'une région elliptique.
      Canvas.Draw(0,0,fBmp); //Dessin de l'avatar.
      {FrameRgn() est une fonction qui dessine un contour autour de la région.
       Mais ici, résultat bizarre dû à l'ombre de la bulle, je pense.}
      //Canvas.Brush.Color:=clblack;
      //FrameRgn(Canvas.Handle,Medaillon,Canvas.Brush.Handle,1,1);
      SetWindowRgn(Handle,Medaillon,True ); //On applique la région à la fenêtre Windows.
    end;

    END.

    ----------------------------------------------------------

    Exemple d'utilisation:


    uses RoundHintUnit;

    var H1 : TRoundHint;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Application.ShowHint  := true;
    Application.HintPause := 0;
    Application.HintHidePause := -1;
    H1 := TRoundHint.Create(nil);
    H1.Image := Image1.Picture.Bitmap;//ici, 100x100 pixels.
    //Pour fermer: H1.ReleaseHandle;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
      var  Rect : TRect;
    begin
      Rect.Left   := 10;//Les hints peuvent éventuellement occuper tout l'écran.
      Rect.Top    := 10;
      Rect.Right  :=Rect.Left+4+Image1.Width;//+4 pour centrer. Pkoi? Mystère...
      Rect.Bottom :=Rect.Top+Image1.Height;
      H1.ActivateHint(Rect,'');//Chaîne vide.
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
      begin
      H1.ReleaseHandle;
    end;

  • signaler à un administrateur
    Commentaire de Caribensila le 15/12/2007 18:34:41

    ... ça peut être rigolo de remplir l'écran d'avatars, non?

    mdrrrr

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 18:35:12

    @cirec:
    C'est bien vu avec le FreeAndNil(Bitmap[i] car çà règle le souci de la violation d'accès
    mais en revanche cette procédure déclenche des Sursauts intempestifs dans le mouvement des avatars..
    C'est la raison pour laquelle j'attends encore un peu avant
    de faire une modif.
    @bientôt

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 18:38:33

    @caribensila :
    Merci, j'étais juste en train de répondre à cirec et je me disais
    "pourquoi caribensila il me la file pas sa HintPerso..".
    et toc !

    je regarde tout çà..

  • signaler à un administrateur
    Commentaire de Caribensila le 15/12/2007 21:49:15

    @cantador
    ...A l'origine, je voulais n'utiliser que des Hints pour les avatars et les textes afin d'en remplir l'écran...

    Mais j'ai bcp de mal à les animer, ces foutus Hints.

    'Me suis mis la barre un peu haut sur ce coup...  lol
    Si t'y arrives, ça m'intéresse.

  • signaler à un administrateur
    Commentaire de Caribensila le 15/12/2007 22:49:43

    Bon!
    J'y suis arrivé, mais c'est trop lent pour ce genre d'application.
    J'abandonne cette voie.

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 23:11:23

    Oui efectivement j'ai installé ton unité et intégré le code.
    Mais les résultats au niveau des bulles sont décevants pour l'instant.
    il semble que les theads bloquent l'apparition des bulles..


    Même en utilisant un truc simple comme ci-dessous :

    çà ne fonctionne pas npn plus..

    Voilà pourquoi je me suis tourné vers le TjvBallonHint..

    Il me reste néamoins à régler :
    - accélération de l'ouverture
    - et les morceaux de bullles qui restent de temps en temps



    procedure DoHint(AControl: TControl);  // autre solution
    var
      pt: TPoint;
    begin
      pt := AControl.ClientToScreen(Point(1, 1));
      SetCursorPos(pt.x, pt.y);
      Application.ActivateHint(pt);
    end;

    procedure TFAvatar.AffichageBulle;
    var
      X, Y: integer;
    //  Bulle: TJvBalloonHint;
    begin
      Randomize;
      X := RandomRange(0, 10); {sélection aléatoire de l'image}
      Y := RandomRange(0, 3); {sélection aléatoire du texte}

      Image[X].Hint := InfoBulle[X, Y];    // autre solution
      DoHint(Image[X]);
      PAvatar.Repaint;  

    {  Bulle := TJvBalloonHint.Create(PAvatar); {création du JvBallonHint}
      Bulle.Options := Bulle.Options - [boShowCloseBtn]; {suppression du bouton de fermeture de la bulle}
      if Image[X].Parent <> nil then {L'image a t-elle un parent ?}
        Bulle.ActivateHint(Image[X], InfoBulle[X, Y], InfoEntete[X, Y], 0); {Affichage de la bulle}
      Application.ProcessMessages; {pour forcer l'affichage du texte}
      sleep(1500); {petite pause pour permettre la lecture}
      Bulle.free; {libèration la bulle}
      if not ((FinThread1 = true) and (FinThread2 = true) and {test de la fin des 10 threads}
        (FinThread3 = true) and (FinThread4 = true)
        and (FinThread5 = true) and (FinThread6 = true)
        and (FinThread7 = true) and (FinThread8 = true)) then
        PAvatar.Repaint;  }
    end;

    Bref, faut encore y laisser de la sueur !

  • signaler à un administrateur
    Commentaire de Caribensila le 15/12/2007 23:11:54

    'FAUT JAMAIS ABANDONNER, 'TAIN DE CON !

    Finalement, je m'en suis sorti.  lolll

    Si ça t'intéresse, je t'envoie le test par email Cantador, car j'ai peur de pourrir cet espace avec des trucs pas finis.

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 23:13:55

    et bien sûr les Hint natifs des images non plus !
    ça aurait été trop simple..

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 23:16:10

    no problemo : pulsar3000@wanadoo.fr

  • signaler à un administrateur
    Commentaire de Caribensila le 15/12/2007 23:17:46

    Ah ouais...
    J'ai pas essayé avec threads.
    ça doit pas arranger l'affaire.

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 23:21:18

    Sûr qd les avatars ont tous attéris sur le sol et que l'arrêt est complet (donc plus de thread) les bulles s'affichent
    nickel chrome.

  • signaler à un administrateur
    Commentaire de Caribensila le 15/12/2007 23:24:24

    Bein, t'es jamais content...

    Si ça s'affiche à un moment donné, c'est déjà ça!

    mdrrrrrrrrr

  • signaler à un administrateur
    Commentaire de cantador le 15/12/2007 23:32:04

    Maigre consolation..

    Tiens dépité, je vais le refaire avec un seul avatar et
    une seule bulle !

  • signaler à un administrateur
    Commentaire de cantador le 16/12/2007 12:44:42

    @caribensila :
    merci pour le zip..
    c'est une découpe en rond que je vois et un mvt à vitesse constante.
    Je m'attendais à un traitement siouc de bulles..
    Mais il n'y a aucun message qui apparaît.
    A moins que..

  • signaler à un administrateur
    Commentaire de cirec le 17/12/2007 13:33:00 administrateur CS

    eh ... s'avez quoi ...

    J''ai trouvé !
    Si si..
    Ça y est !
    j''ai trouvé !
    Mince alors..
    J''ai encore trouvé !!

    MDR

    Plus sérieusement j'ai effectivement trouvé pourquoi tes thread ne pouvaient être arrêtés.

    Le thread est fait pout être utiliser pour une action répétitive en tache de fond. Toi tu l'utilise pour démarrer une procédure  qui rentre dans une boucle (et c'est ça qui empêche l'arrêt du thread) et une fois la boucle fini le thread est arrêté et libéré. En fait on peut lancer ta procédure depuis un OnClick (j'ai fais le teste) et ça fonctionne ... pour un exemple de MultiThread c'est pas très top.

    Si tu la veux, j'ai refait ton application, en MultiThread, elle fonctionne très bien même avec plusieurs séries d'avatars (selon le PC) et le Hint s'affiche correctement et n'arrête que l'avatar concerné.

    J'ai essayé de garder le maximum de ton code ... mais bon j'ai quand même dû y faire quelques coupes. ;)

  • signaler à un administrateur
    Commentaire de cantador le 17/12/2007 14:22:39

    @cirec:
    Ben tu vois que mes commentaires n'étaient pas surfaits !
    un peu que je veux la voir ta solution..
    (pulsar3000@wanadoo.fr)
    et si elle me convient je fais la modif illico..
    Tu sais ce n'est plus mon programme..
    Il appartient désormais à tous ceux qui ont participé à ce
    projet de multi-threading + affichage des bulles.

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS