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

C++Builder Discussion :

Optimisation de la fonction sleep dans un traitement d'image


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut Optimisation de la fonction sleep dans un traitement d'image
    Bonjour les champions !

    J'ai fait un soft de diaporama pour une vitrine d'agence immobilière. Il m'ont demandé de rajouter des transitions entre images j'ai donc pondu le code suivant qui charge une photo par dessus l'ancienne avec une transition caré. C'est a dire que je part du centre, je colorie a la verticale le cotes gauche du centre, puis a l'horizontale au dessus du centre, puis a la verticale le cotes droit du centre, puis a l'horizontale sous le centre. Une fois le tour fini je refresh l'image et j'agrandis mon carré a la rangé de pixel suivante. Mon souci pour qu'on voye la transition j'utilise un sleep dans ma boucle. Mais cette fonction est bloquante pour le programme, ce qui ralentie toute les autres fenêtre. Comment rendre tout cela plus fluide, n'ai je d'autre solution que de pondre un thread ? ( mais je ne suis pas très a l'aise avec ça )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    void TDiaporama::transition (AnsiString ndf)
    {
            int tr , cx, cy, x,y ;
            //determine le centre de l'image
            // plus efficasse si width et height sont impair
            cx = LaPhoto->Width / 2 + 1 ;
            cy = LaPhoto->Height / 2 + 1;
            TJPEGImage *LImageJPEG ;
            LImageJPEG = new TJPEGImage ;
            LImageJPEG->LoadFromFile(ndf) ;
            Graphics::TBitmap *source = new Graphics::TBitmap();
            source->Width = LaPhoto->Width ;
            source->Height = LaPhoto->Height ;
            source->Canvas->StretchDraw(source->Canvas->ClipRect,LImageJPEG) ;
            LaPhoto->Canvas->Pixels[cx][cy] =  source->Canvas->Pixels[cx][cy] ;
            for( tr = 1 ; tr < cx ; tr ++)
            {
                    Sleep(5) ;
                    x = cx -tr ; //fixe x gauche du cente
                    for( y = cy + tr - 1 ;  y >= cy - tr ; y --)
                    //colorie le cotes gauche
                        LaPhoto->Canvas->Pixels[x][y] =  source->Canvas->Pixels[x][y] ;
                    y =  cy - tr ;//fixe y au dessus du centre
                    for( x = cx -tr + 1 ; x <= cx + tr ; x++)
                    //colorie le haut
                        LaPhoto->Canvas->Pixels[x][y] =  source->Canvas->Pixels[x][y] ;
                    x = cx + tr ;//fixe x apres le centre
                    for( y = cy - tr + 1 ; y <= cy + tr ; y ++ )
                    //colorie le cotes droit
                        LaPhoto->Canvas->Pixels[x][y] =  source->Canvas->Pixels[x][y] ;
                    y = cy + tr ;//fixe y  sous le centre
                    for( x = cx + tr - 1 ; x >= cx - tr ; x-- )
                    //colorie le bas
                        LaPhoto->Canvas->Pixels[x][y] =  source->Canvas->Pixels[x][y] ;
                    //affiche l'image
                    LaPhoto->Refresh() ;
            }
            delete LImageJPEG ;
            delete source ;
    }
    Merci d'avance !!

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, si tu n'aimes pas les thread tu peux utiliser un Timer avec une boucle while dans laquelle tu laisse respirer le programme avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->ProcessMessages(); //Traitement des messages actuellement dans la file d'attente des messages
    Je pense que sa pourrait fonctionner
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Effectivement a chaque exécution de la fonction lié au timer le programme avance plus vite, mais il est tjr figé entre temps. Et si je réduit la duré du timer pour avoir plus de refresh les actions utilisateurs sont complètement zapé. En fait il faudrais que je synchronise l'avancement de ma boucle par un timer. Ou que je copie le code de mon for dans un timer, et a chaque timer ma boucle est exécuté une fois.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    non il y a d'autres methodes...



    a) tu fais un timer sub-secondes (j'ai un code sur la page sources C pour avoir le temps en microsecondes, et le timer setiitmer peut donner des microsecondes (enfin normalement environ plutot des millisecondes, mais enfin en raffraichissment c'est deja pas mal)).


    b) Meme sans utiliser de timer, tu te sers de ma fonction pour recuper le temps en mciro-secondes, et tu ne rentre dans ton traitement que toutes les N micro/milli secondes.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
            Debut = GetClock();
            Fini = 0 ;
            tr_debut = 1 ;
     
            while ( ! Fini )
              {
                 T = GetClock();
                 if ( (T - Debut) >= Limite )
                 {
                      Debut = T ;
                      x = cx -tr_debut ; //fixe x gauche du cente
                      ....
                      LaPhoto->Refresh() ;
     
                      tr_debut = tr_debut + 1 ;
                      if ( tr_debut == cx )
                        {
                           Fini = 1 ;
                        }
                  }
     
               Ecran->Refresh();
            }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Sérieusement là c'est devenu beaucoup plus compliqué qu'un thread

    Tu devrais jetté un coup d'oeil à ceci: http://chgi.developpez.com/thread/

    N'est pas peur, c'est pas très compliquer. La moitié du code est fais par C++Builder
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  6. #6
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Dans mon dernier message je parlais du message de Traxsilver et non celui de souviron34 (qui est plus vite que moi pour écrire).
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Crayon Voir le message
    Sérieusement là c'est devenu beaucoup plus compliqué qu'un thread
    Ah oui ? tu trouves ca plus complique ??????
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Entre temps j'ai codé la version avec un timer qui fait avancé ma boucle toute les milisecondes. J'ai donc rajouter toute les variable dans ma classe pour que leur valeur soit conservé entre 2 event du timer.
    Ca marche niquel et ca prend 10% de cpu ... pour 1 écran avec une image de 320*240 , j'en ai 20 a gérer en 800*600... Le temp d'exécution est tellement lents pour 20 écrans qu'en pleine transition le soft envoie déjà la prochaine image. Donc il me reste plus que le thread
    Mais je vais prendre mon courage a 2 mains, et lire le tuto qu'un gentils particulier c'est donné tant de mal a écrire.

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Traxsilver
    Peut etre que tu peut utiliser " AnimateWindow ", ca ne fonctionne apparemment qu'avec des bmp, mais comme on peut trnsformer des JPEG en BMP, c'est peut etre une piste
    Un bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    HBITMAP bmp; <--- ne pas oublier
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    String a = Edit1->Text;
    Form1->Visible = false;
    bmp = LoadImage(Form2->Handle,"C:\\Documents and Settings\\blondelle\\Mes documents\\Mes images\\Massiv10\\Massiv10\\Bitmaps\\Arrow\\arcarrow1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    Form2->BorderStyle = bsNone;
    Form2->Brush->Handle = CreatePatternBrush(bmp);
    // Animation de la fenêtre
    AnimateWindow(Form2->Handle, 10000, StrToInt(a));
    Form1->Visible = true;
    }
    //---------------------------------------------------------------------------
    /*
    AnimateWindow(Form1.Handle, 1000, AW_HOR_POSITIVE or AW_HOR_NEGATIVE or AW_Hide);
    AnimateWindow(Form1.Handle, 1000, AW_HOR_POSITIVE or AW_HOR_NEGATIVE or AW_CENTER);
    AnimateWindow(Form1.Handle, 1000, AW_HOR_NEGATIVE or AW_HOR_POSITIVE or AW_Hide);
    AnimateWindow(Form1.Handle, 1000, AW_HOR_POSITIVE or AW_HOR_NEGATIVE or AW_SLIDE);
    AnimateWindow(Form1.Handle, 1000, AW_VER_POSITIVE or AW_HIde);
    AnimateWindow(Form1.Handle, 1000, AW_VER_NEGATIVE or AW_SLIDE);
    AW_ACTIVATE|AW_BLEND
    SW_MAX or AW_HIDE
    */
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  10. #10
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    D'après ce que j'ai compris de la doc de cette fonction, elle anime toute la fenêtre, donc je doit faire se superposer les fenêtre, étant donné que je gérè 20 fenêtre pour 20 écrans, j'ai bcp de calcul derrière. J'ai essayé de produire le handle sur mon TImage plutot que sur la fenêtre mais ca ne fonctionne pas. Le code est compilé mais il me dit que mon TImage n'est pas un bmp et j'ai une exception a l'exécution.

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    Pourquoi ne pas essayer avec une animation flash ?
    Tu n'as qu'a mettre un composant Flash sur ta form, et tu envois ton animation.

  12. #12
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Car j'espérais faire ça portatif et ne pas dépendre d'une apply ou d'une licence externe. J'ai codé en multi thread, Ca fonctionne tant qu'on arrête pas le programme. J'ai un problème a la destruction des classes ils détruisent les thread aléatoirement. Genre au test du IF pour savoir si la valeur du pointeur est a null c FAUX et a la micro seconde d'après le thread c'est détruit tout seul et je mange une exception au delete

Discussions similaires

  1. Mission freelance dans le traitement d'image
    Par saturn1 dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 08/02/2014, 20h15
  2. Nouveaux domaines de recherche dans le traitement d'images
    Par soniaIRM dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 11/10/2013, 16h39
  3. Idée pour un projet dans le traitement d'images
    Par krolis dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 23/02/2012, 12h20
  4. Rôle de la transformée en ondelettes (WT) dans le traitement d'image
    Par matnes dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 01/10/2007, 23h39
  5. Octave et MATLAB dans le traitement d'images
    Par MBAYE BABACAR GUEYE dans le forum Images
    Réponses: 6
    Dernier message: 12/06/2007, 17h53

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