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