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é: 3 633 / 187

Note :
Aucune note

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

Description

Cliquez pour voir la capture en taille normale
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

 

Fichier Zip

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

Historique

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..

Commentaires et avis

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

Discussions en rapport avec ce code source dans le forum

Pixel d'une image ( bmp ) [ par Bruto ] Voilà, je voudrais récupérer chaque pixel d'une image bmp et vérifier la couleur. Les sources sur le site ( en parcourant les titres ) non pas l'air d Transformer un gif en bmp [ par chookoo ] J'ai besoin d'ouvrir une image gif et ensuite la transformer en format bmp.1. Est-ce que quelqu'un sait comment ouvrir l'image gif (doit-il y avoir un accéder aux propriétés pixels d'une image [ par costello ] bon voila le problème:j'ai fait un logiciel sympa, qui applique un effet sur des images, tout ça en faisant des petits algorythmes simples sur des ima Redimensionner une image [ par etrix ] Lut tout le monde ?ca va bien ?Alors voilà moi j'ai un ptit problème qui m'embête beaucoup :/ c'est pour cela que je fais appel à votre aide !J'ai déj prob DLL DES RESSOURCES BMP [ par ahmed12 ] Je utilise une dll qui contient des bitmaps a pris avoir compiler une ressource. Et j'ai arrivé de charger ces bmp dans la l'application Hote avec ce ecrire sur une image [ par manu00 ] Bonjour,je suis en train de dev un petit soft d'edition d'image pour m'amuser et je voudrais juste faire cela:-Ouvrir un BMP ou un JPG (ca j'y arrive) Passer un fichier image .bmp comme paramètre d'une procédure stockée [ par fonkou ] J'ai une procédure stockée qui insère une image dans la base de données SQL Server. La procédure stockée reçoit deux paramètres qui sont @Matricule et conversion image format gif <--> bmp [ par yvessimon ] Comment convertir des images gif en bmp afin de pouvoir les visualiser avec Timage.Actuellement je lance "paint" avec shellexecute puis je sauvegarde Transparence des images. [ par Becracker ] J'ai une Form1 et je voudrais y ins&#233;rer une image avec transparence. Mais vu qu'on ne peut ins&#233;rer que des images au format bmp dans les for Taille d'une image [ par Francky23012301 ] Salut &#224; tous ,Voila je souhaite placer une image d'un fichier blabla.bmp dans un T image Le code estImage1.Picture.LoadFromFile(blabla.bmp);Seule


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.