2010-06-02 49 views
0

我有一個從列表框中獲取文件名,執行system()調用,然後將該文件名移動到另一個列表框的循環。問題是,它不會一次一個地移動文件名,而是一直等到整個循環完成並一次移動它們。我該怎麼做才能讓它達到我想要的效果?循環不會更新列表框直到迭代完成

循環:

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 
} 

的功能轉換(),它包含了系統調用:

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

這可能是更新之間缺少屏幕/小部件刷新調用的問題嗎? – 2010-06-02 14:13:40

+0

看起來像共識認爲如此。不知道我需要這樣做,因爲我從來沒有真正使用過表單。猜猜我會去查找如何 – Justen 2010-06-02 14:19:00

+0

在你的循環中,你不給系統時間來重繪你的控件,如果你想在屏幕上看到它,你需要允許繪製事件在每個循環迭代之間流動 - 什麼調用取決於你使用的是哪種UI(你沒有提到)。 – 2010-06-02 14:24:11

回答

1

您需要在循環結束時調用刷新函數,迫使它重新繪製列表框,否則它將等待循環完成。

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

告訴兩個列表框移動的項目後,刷新自己。

2

在GUI編程中,從「事件線程」或「事件循環」調用的方法需要在屏幕上顯示更改之前完成,這是非常常見的。這與語言或環境無關。在我最熟悉的事物(如Java Swing)上避免這種問題的常用方法是在事件循環之外進行更新,但使用通知(swing事件)告知GUI偶爾更新顯示。