Probleme de thread qui bug quand on bouge la souris

Probleme de thread qui bug quand on bouge la souris - C++ - Programmation

Marsh Posté le 06-04-2005 à 10:30:09    

Bonjour,
Je programme actuellement sous borland C++ v6 et j'ai un gros bug de thread.
Je fait un visualisateur d'image qui créé des thumbnails pour chaque image pour que ca aille plus vite. Je fait l'affichage page par page. Donc dès qu'il a fini de créé la premiere page d'image je lance un thread qui va me créé tout les autres thumbnails sur le disque.Le thread se lance, et si je bouge pas la souris il arrive a me crée tout les thumbnails correctement. Mais si je bouge la souris au bout d'un moment le thread bug et il prend toujous la meme image pour les thumbnails ! Je ne comprend pas le rapport entre l'execution de mon thread et l'interference que cela peut avoir avec ma souris . HELP !!  
 
alors pour crée mon thread j'utilise la fonction :  
CreateThread(NULL,NULL,ThreadProc,NULL,NULL,&ThreadId);
 
puis je met mon code : (ListeFichiers étant une TStringList déclarer en global)
 

Code :
  1. DWORD WINAPI ThreadProc(LPVOID lpParam)
  2. {
  3.   AnsiString extension,NomFichier;
  4.   Form1->Label5->Caption="Création des fichiers Thumbnails en cours..." ;
  5.   TJPEGImage *jpg = new TJPEGImage();
  6.   Graphics::TBitmap * Bitmap = new Graphics::TBitmap;
  7.   float ratio_width;
  8.   float ratio_height;
  9.   for (int i=15; i<ListeFichiers->Count; i++)
  10. {
  11.     Form1->ImageCacher->Canvas->Brush->Color = clWhite;
  12.     Form1->ImageCacher->Canvas->FillRect(Form1->ImageCacher->Canvas->ClipRect);
  13.  extension=ExtractFileExt(ListeFichiers->Strings[i]);
  14.  NomFichier=ExtractFileName(ListeFichiers->Strings[i]);
  15.     Form1->Label6->Caption=NomFichier;
  16.  if (extension==".jpg"|| extension==".jpeg" || extension==".JPG"|| extension==".JPEG" )
  17.  {
  18.   jpg->LoadFromFile(ListeFichiers->Strings[i]);
  19.      
  20.   Bitmap->Assign(jpg);
  21.   if(Bitmap->Width>Form1->ImageCacher->Width || Bitmap->Height>Form1->ImageCacher->Height)
  22.   {
  23.    ratio_width= Bitmap->Width/((float)Form1->ImageCacher->Width);
  24.    ratio_height= Bitmap->Height/((float)Form1->ImageCacher->Height);
  25.    if (ratio_width<ratio_height)
  26.     Form1->ImageCacher->Canvas->StretchDraw(Rect(0,0,Bitmap->Width/ratio_height,Bitmap->Height/ratio_height),Bitmap);
  27.    else
  28.     Form1->ImageCacher->Canvas->StretchDraw(Rect(0,0,Bitmap->Width/ratio_width,Bitmap->Height/ratio_width),Bitmap);
  29.    Form1->ImageCacher->Picture->SaveToFile( "D:\\thumb\\thumb_JPG_"+NomFichier+".bmp" ) ;
  30.   }
  31.   else
  32.   {
  33.    Form1->ImageCacher->Canvas->StretchDraw(Rect(0,0,Bitmap->Width,Bitmap->Height),Bitmap);
  34.         Form1->ImageCacher->Picture->SaveToFile( "D:\\thumb\\thumb_JPG_"+NomFichier+".bmp" ) ;
  35.   }
  36.       Bitmap->FreeImage();
  37.       jpg->Empty;
  38.  }
  39.  if(extension == ".bmp"|| extension==".BMP" )
  40.  {
  41.   Bitmap->LoadFromFile(ListeFichiers->Strings[i]);
  42.   if(Bitmap->Width>Form1->ImageCacher->Width || Bitmap->Height>Form1->ImageCacher->Height)
  43.   {
  44.    ratio_width= Bitmap->Width/((float)Form1->ImageCacher->Width);
  45.    ratio_height= Bitmap->Height/((float)Form1->ImageCacher->Height);
  46.    if (ratio_width<ratio_height)
  47.     Form1->ImageCacher->Canvas->StretchDraw(Rect(0,0,Bitmap->Width/ratio_height,Bitmap->Height/ratio_height),Bitmap);
  48.    else
  49.     Form1->ImageCacher->Canvas->StretchDraw(Rect(0,0,Bitmap->Width/ratio_width,Bitmap->Height/ratio_width),Bitmap);
  50.    Form1->ImageCacher->Picture->SaveToFile( "D:\\thumb\\thumb_"+NomFichier) ;
  51.   }
  52.   else
  53.   {
  54.    Form1->ImageCacher->Canvas->StretchDraw(Rect(0,0,Bitmap->Width,Bitmap->Height),Bitmap);
  55.         Form1->ImageCacher->Picture->SaveToFile( "D:\\thumb\\thumb_"+NomFichier) ;
  56.   }
  57.       Bitmap->FreeImage();
  58.     }
  59.   }
  60.   Form1->Label5->Caption="Tout les thumbnails ont été créé";
  61.   return 0;
  62. }

 
Merci de votre aide.


Message édité par TeigneuX le 06-04-2005 à 10:31:16
Reply

Marsh Posté le 06-04-2005 à 10:30:09   

Reply

Marsh Posté le 06-04-2005 à 17:44:11    

Tu as utilisé un mutex pour être sûr que tu ne dessines pas ton Canvas pendant un appel à StretchDraw ?
 

Reply

Marsh Posté le 06-04-2005 à 17:59:43    

Non, je ne connais pas les mutex. Peut tu m'expliquer stp.Est-ce obligatoire?
Je veut juste que le thread se lance et va au bout de son action mais en tache de fond pour que je puisse visualiser les thumbnails que le thread a deja crée.(avant qu'il ne soit entierement terminé)
merci.

Reply

Marsh Posté le 06-04-2005 à 18:25:45    

J'ai regardé par curiosité (je ne connais pas BCB), et visiblement, d'après ce doc (qui est pour Delphi, mais ça doit se valoir):
http://safariexamples.informit.com [...] pter11.pdf
 
Tu dois pouvoir faire un :

Code :
  1. Form1->ImageCacher->Canvas->Lock();


et un Unlock() à la fin, lorsque tu dessines sur ton Canvas depuis différents threads.

Reply

Marsh Posté le 06-04-2005 à 19:23:35    

Slt,
C moi qui ai posé la question.En faite j'utilisai le compte d'un copain pour poster car le mien n'etait pas encore crée.
 
Je vien d'essayer et ca marche !!!!!
 
Merci beaucoup !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed