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 :

Problème de thread : Plus de ressources système [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut Problème de thread : Plus de ressources système
    Bonjour, voilà je travail sur un thread qui agie sur une image de type TPicture, qui après traitement est asssigné à un TJPEGImage (afin de compresser biensur). Jusque là aucun soucix, le seul problème recontré est au moment de SaveToFile du JPEG, il me donne une erreur : "Plus de ressources système" lorsque je bouge la sourie, dans le cas contraire, ça tourne nikel, auriez vous une idée ?
    Donc je pense que c'est l'évènement de la souri qui pose problème (le clavier n'agit en rien ici)

    j'ai tenté de contourner ceci, avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
     
    }
    __finally
    {
     
    }
    Mais ça ne fonctionne pas non plus

    Auriez-vous une idée ?

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut Countournement provisoire
    Salut !
    bon j'ai contourné le problème en supprimant mon thread, et en utilisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool active = true;
    while (active)
    {
    /* Traitement */
    Application->ProcessMessages (); //Pour garder la main de temps en temps
    }
    C'est du provisoire, mais bon ça semble marcher ainsi.

    Si par contrevous avez une idée sur le problème rencontré avec mon thread.
    Merci

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut Reciblage de l'erreur
    En fait il s'avère que l'erreur viendrai de l'Assign

    je comprends pas trop pourquoi cette erreur apparait que dans un thread et non dans une appli standard avec un while (1).

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Es-tu sûr de synchroniser depuis ton thread tous les appels à des objets VCL ( et donc bien sûr les traitements sur tes TPicture, TJPEG...)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut synchroniser
    Tu entends quoi par synchroniser ?
    utiliser : Synchronize ()
    c'est bien ça? mais que faudrai-il mettre dedans?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Tout ce qui fait appel à des objets VCL.
    Regardes le commentaire ajouté par BCB lors le la création d'un nouvel objet thread.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut
    je vois bien le principe de synchronize, mais c plus pour un affichage là non?

    Moi je reste en mémoire, rien de visuel.

    A moins kil existe une méthode plus simple pour convertir un bmp en jpg sans passer par la classe JPEGImage

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Non, rien à voir avec l'affichage. Le problème, c'est la VCL (composants visuels ou non)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut
    l'utilisation de synchronize a l'air de résoudre le pb, mais par contre je suis obligé de mettre la priorité du thread a : tpHighest, sinon ça replante.
    Et de plus, g un problème avec un deuxième thread qui tourne à côté, qui quand à lui perd de sa vitesse d'exécution...

  10. #10
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    il me donne une erreur : "Plus de ressources système"

    question bete : as tu bien pensé à supprimer Bitmap après son assignation. ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut
    Oui j ai pensé, mais en fait j'suis dans une boucle sans fin (d'ou un thread) qui prend une image bmp et la copie dans un jpg, donc je n'ai pas besoin de supprimer le bmp, mais bon, même en testant un delete et après un new à chaque passage de ma boucle, j'ai toujours le même soucix.

  12. #12
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    un petit bout de code ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut
    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
    void __fastcall TCapture::Execute()
    {
    //---- Placez le code du thread ici ----
    Bitmap = new Graphics::TBitmap;
     
    while (!Terminated)
            {
            /* On travail ici sur le Bitmap */
     
            Synchronize (assign);
            }
     
    delete (Bitmap);
    }
     
     
    void __fastcall TCapture:: assign ()
    {
    TJPEGImage *jpg = new TJPEGImage;
     
    jpg->Assign (Bitmap);
     
    Application->ProcessMessages ();
     
    if (FileExists ("./out/" + IntToStr (i) + ".jpg"))
            DeleteFile ("./out/" + IntToStr (i) + ".jpg");
     
    jpg->SaveToFile ("./out/" + IntToStr (i) + ".jpg");
    delete (jpg);
    }

  14. #14
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    Peut etre que ça vient enpartie du fait que ce petit de code VCL est hors de synchronize..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Bitmap = new Graphics::TBitmap;
     
    while (!Terminated)
    {
    /* On travail ici sur le Bitmap */
    ...

  15. #15
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello

    Tu peux utiliser des objets de la VCL dans tes threads sans passer par des Synchronize, du moment que ces objets ne sont pas utilisés par le thread principal. Ca veut donc dire que tes objets liès à l'affichage doivent obligatoirement être modifiés via un synchronize.
    Maintenant, rien ne t'empêche (par exemple) de bricoler avec des TQuery à l'intérieur de tes threads, si ces TQuery sont créés dans le thread (new TQuery(NULL)), ainsi que leur TDatabase lié, ainsi que le TSession lié (voir TSessionList)...

    Si j'ai bien compris, tu as un TPicture nommé Bitmap, et un TJPEGImage nommé jpg. Si Bitmap est sur une fiche, faut faire le Assign dans une méthode appelée par Synchronize...

    Si tu as un bout de code à nous montrer, n'hésite pas...

    A++

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut
    ça semble mieux marcher, je peux au moins utiliser des priorités inférieurs (ça rame moins)

    Mais par contre mon traitement se fait image par image avec à chaque étape écriture sur le disque, donc traitement assez long

    Pensez-vous qu'il est possible de réaliser un système ou 2 threads en concurrence se partagents un tableau d'une centaine de jpg, une thread rempli, et l'autre sauvegarde les premières si elles sont remplies, et ainsi de suite, et dès qu'une jpg est sauvée, elle est libéré pour le remplissage (bon y aura toujours un soucix de temps je pense, vu qu'une ira plus vite que l'autre)

    PS : je n'ai rien du tout sur ma fiche, tout en mémoire

  17. #17
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    (Oups je n'avais pas vu les messages passés entre temps)

    Curieux, dans un projet quasi vide, ta boucle Execute a l'air de tourner sans soucis (pas de handle de perdus, mémoire stable)... (par contre le Application->ProcessMessages dans assign met le CPU à 100%, et sans ça marche nickel)

    Pour ta suggestion: pourquoi pas ? un TThreadList permettrait de partager les TJPEGImage

    A++

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut
    Oulla explorer.exe aime pas le gros!

    Bon j'aurai ptetre une solution, mais bon, savez vous si on peut vérifier si 2 images sont identiques ou non, ainsi, je ne auvegarde que lorsque les images sont différentes, afin de gagner de la charge mémoire et disque.

    Sinon je regarderai du côté de : TThreadList

Discussions similaires

  1. Problème de threads
    Par iwky dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 04/03/2006, 13h45
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 10h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 16h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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