Цикл не обновляет списки, пока это не будет сделано итерацией - PullRequest
0 голосов
/ 02 июня 2010

У меня есть цикл, который берет имя файла из списка, выполняет системный вызов (), а затем перемещает это имя файла в другой список. Проблема в том, что он не перемещает имена файлов по одному за раз, а ждет, пока не закончится весь цикл, и перемещает их все сразу. Что бы я сделал, чтобы заставить его работать так, как я хочу?

петля:

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 ]

2 голосов
/ 02 июня 2010

Очень часто в программировании с графическим интерфейсом пользователя методы, вызываемые из «потока событий» или «цикла событий», должны завершаться до того, как сделанные ими изменения будут видны на экране. Это независимо от языка или окружающей среды. Обычный способ избежать этой проблемы в вещах, с которыми я больше всего знаком (например, в Java Swing), состоит в том, чтобы делать обновления вне цикла событий, но использовать уведомления (события свинга), чтобы сообщать графическому интерфейсу пользователя об обновлении дисплея. 1001 *

1 голос
/ 02 июня 2010

Вам нужно будет вызвать функцию обновления в конце вашего цикла, заставив ее перерисовать ваши списки, в противном случае он будет ждать этого после цикла.

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 голос
/ 02 июня 2010

Скажите обоим спискам обновляться после перемещения элемента.

...