2016-05-25 2 views
0

Я работаю в Visual Studio с C++, Windows Form App. Я пытаюсь нарисовать красную кнопку, подождать 3 секунды, а затем нарисовать ее синим цветом.Функция C++ Сон() выполняется перед фрагментом кода

button1->BackColor = System::Drawing::Color::DarkRed; 
Sleep(3000); 
button1->BackColor = System::Drawing::Color::CornflowerBlue; 

Однако функции Sleep() выполняются перед первой строкой (красная краска). Программа начинается с ожидания 3 секунды, а после времени она окрашивает кнопку синего цвета. Кажется, что краска красной части кода не успевает исполнить. Индивидуально, краска красная прекрасно работает. Я также пробовал другие решения задержки. Пример:

int wait = clock() + 2 * CLOCKS_PER_SEC; 
while (clock() < wait) {} 

Это, как представляется, проблема в Visual Studio C++, так как функция Sleep() работал отлично в Code :: Blocks консольный скрипт. Есть ли у вас идеи решения?

+0

Я предполагаю, что вы помещаете основной поток в сон, поэтому у него нет времени обновлять цвет фона до красного. –

+0

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

+0

. Кнопка должна быть принудительно перерисована сама по себе - она ​​не делает это по причинам производительности по умолчанию, а вызов 'Sleep()' приостанавливает поток до этого случается. Если вы используете .NET - вы этого не сделали, попробуйте добавить 'button1-> Refresh()' перед вызовом 'Sleep()'. – Peter

ответ

0

Установка свойств компонента, например 'button1-> BackColor = System :: Drawing :: Color :: DarkRed;' не являются тривиальными назначениями. Методы setter генерируют сообщения или последовательности сообщений, которые отправляются в Windows/thread, которые реализуют GUI. Эти сообщения должны быть обработаны до того, как запрошенные действия по набору свойств могут быть считаны завершенными.

Если вы устанавливаете визуальное свойство окна в обработчике событий, а затем удаляете все выполнение из потока, управляющего этим окном, перед тем как покинуть обработчик событий, сообщения не будут обработаны.

Не ждите в обработчике событий GUI. Это государственная машина для обработки сообщений. Не останавливайся.

0

Спасибо за ваш вклад! Рекомендации по темам были полезны. Я решил эту проблему с помощью функции Refresh(). Кажется, что части кода обрабатываются разными потоками, которые работают асинхронно. Функция Refresh(), вероятно, реализует ожидание потоков с помощью синхронизации.