2010-06-02 4 views
0

J'ai une boucle qui prend un nom de fichier à partir d'une zone de liste, effectue un appel system(), puis déplace ce nom vers une autre zone de liste. Le problème est, il ne déplace pas les noms de fichiers sur un à la fois, mais attend jusqu'à ce que la boucle entière est terminée et les déplace tous à la fois. Que ferais-je pour le faire fonctionner comme je le veux?Boucle ne met pas à jour les zones de liste tant que l'opération n'est pas répétée

la boucle:

for each(String^% file in filename) 
{ 
    int x = convert(file); 
    lbComplete->Items->Add(lbFiles->Items[0]); // place the completed file 
    lbFiles->Items->Remove(lbFiles->Items[0]); // in the other listbox 
} 

La fonction convert() qui contient l'appel système:

int convert(String^ file) 
{ 
    std::stringstream ss; 
    std::string dir, fileAddress, fileName, outputDir; 
    ... 
    return system(ss.str().c_str());   
} 
+0

Cela peut-il être un problème avec un appel d'actualisation écran/widget manquant entre les mises à jour? –

+0

On dirait que le consensus le croit. Je ne savais pas que je devais le faire puisque je n'ai jamais vraiment travaillé avec des formulaires. Je suppose que je vais aller chercher comment – Justen

+0

Dans votre boucle, vous ne donnez pas le temps au système de redessiner vos contrôles, vous devez autoriser les événements de peinture pour circuler entre chaque itération de boucle si vous voulez le voir sur l'écran - ce que L'appel dépend du type d'interface utilisateur que vous utilisez (que vous n'avez pas mentionné). –

Répondre

1

Vous auriez besoin d'appeler une fonction de rafraîchissement à la fin de votre boucle pour l'obliger à redessiner vos listes de sélection, sinon il faudra attendre après votre boucle pour le faire.

for each(String^% file in filename) 
{ 
    int x = convert(file); 
    lbComplete->Items->Add(lbFiles->Items[0]); // place the completed file 
    lbFiles->Items->Remove(lbFiles->Items[0]); // in the other listbox 
    // INSERT REFRESH FUNCTION HERE 
} 
1

Dites les deux listboxes pour se rafraîchir après le déplacement d'un élément.

2

Il est très commun dans la programmation GUI que les méthodes appelées à partir du "thread d'événement" ou de la "boucle d'événement" doivent se terminer avant que les changements qu'elles font apparaissent à l'écran. C'est indépendamment de la langue ou de l'environnement. La façon habituelle d'éviter ce problème sur les choses que je connais le mieux (comme Java Swing) est de faire les mises à jour en dehors de la boucle d'événements, mais d'utiliser des notifications (swing events) pour indiquer à l'interface graphique de mettre à jour l'affichage.

Questions connexes