Threads sous Windows/Linux

Signaler
Messages postés
2
Date d'inscription
vendredi 28 juillet 2006
Statut
Membre
Dernière intervention
27 juin 2008
-
Messages postés
2
Date d'inscription
vendredi 28 juillet 2006
Statut
Membre
Dernière intervention
27 juin 2008
-
L'extrait de code ci-après (développé avec wxWidgets en C++) traite une série de fichiers : pour chaque fichier il affiche le nom dans un label, une image est affichée si nécessaire, puis lance un thread et se met en attente pendant que le thread traite le fichier. Au retour, le nom du fichier s'inscrit dans une listbox et une barre de progression se met à jour.

Le thread est utilisé de manière à permettre d'interrompre la boucle
par un clique sur un bouton, qui positionne la valeur
'InterruptTransfer'.

Ce code fonctionne sous Windows (XP, Vista Home) sans problèmes (compilé avec VCExpress 2008).

Sous Linux (GCC, GTK+2, Ubuntu 8.04), le label n'est jamais affiché et la listbox ne s'affiche qu'une fois la boucle terminée, avec toutes les entrées, au lieu de se remplir au fur et à mesure. En revanche, l'image et la barre de prograssion s'affichent.

J'aimerais comprendre pourquoi le code ne fonctionne pas sous Linux, et quelle est la solution.

Merci d'avance.

Le code:
 
  dir.GetFirst(&fileName,wxT("*.*"),wxDIR_FILES);

  do

  { // Traiter un fichier

    ProcessedFiles++;

    message.Clear();
    message.Append(fileName);

    label_PictureName->SetLabel(message);

 
    Orientation = GetPicOrientation(SourceFolder + wxFILE_SEP_PATH + fileName);
    if (Orientation 3 || Orientation 6 || Orientation == 8)

    {

      RotatedIcon->Show();

    }

    Update();

    CopyPicturesThread*  APThread1 = new CopyPicturesThread(this);  // thread
à fin automatique
    if (APThread1->Create() != wxTHREAD_NO_ERROR)

    {

        return -1;

    }

    APThread1->Run();

    APThread1->Wait();

    lb_Copied->Insert(fileName,0); // en tête de la liste

    RotatedIcon->Hide();

    Update();

    progb_Transfer->SetValue(ProcessedFiles);

    fileName.Clear();

    dir.GetNext(&fileName);

  } while (!fileName.IsEmpty() && !InterruptTransfer);

2 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
C'est bizzare ton code. Quand on veut faire un système de thread, on utilise des événements, pas une boucle bloquante. Je vois pas l'intéret du thread puisque tu l'attends dans le thread principal...
Messages postés
2
Date d'inscription
vendredi 28 juillet 2006
Statut
Membre
Dernière intervention
27 juin 2008

Merci pour le message.

Il ne s'agissait pas d'un système de thread, seulement d'un mécanisme simple qui permet de cliquer sur un bouton "Stop" pour interrompre la boucle. Autrement le thread n'apporte rien.

D'ailleurs, j'ai eu l'information pourquoi ça marche sous Windows et pas sous Linux : Linux bloque les messages UI pendant l'attent de la fin du thread alors que Windows lance une boucle d'écoute dans le Wait(), ce qui permet d'intercepter des message comme le click du bouton "Stop".