在迭代完成之前,循环不会更新列表框

时间:2010-06-02 14:09:50

标签: listbox c++-cli clr

我有一个循环,从列表框中获取文件名,执行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
}

包含系统调用的函数convert():

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

3 个答案:

答案 0 :(得分:2)

在GUI编程中,从“事件线程”或“事件循环”调用的方法需要在屏幕上看到它们所做的更改之前完成。这与语言或环境无关。在我最熟悉的事情(如Java Swing)上避免这个问题的常用方法是在事件循环之外进行更新,但是使用通知(swing事件)告诉GUI偶尔更新显示。 / p>

答案 1 :(得分:1)

告诉两个列表框在移动项目后自行刷新。

答案 2 :(得分: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
}