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);