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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    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 Expert
    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
    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

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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();
            }

  5. #5
    Membre Expert
    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
    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

  6. #6
    Membre Expert
    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
    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).

  7. #7
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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 ??????

  8. #8
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    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.

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