我使用C ++,Windows Form App在Visual Studio中工作。我尝试将按钮涂成红色,等待3秒然后将其涂成蓝色。
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)
由于Button也是一个窗口,因此您可以在调用Sleep()
之前使其无效
what is invalidate,update methods do in VC++
答案 1 :(得分:0)
设置组件属性,例如'button1-&gt; BackColor = System :: Drawing :: Color :: DarkRed;'不是琐碎的任务。 setter方法生成发布到实现GUI的Windows /线程的消息或消息序列。必须先处理这些消息,然后才能认为请求的属性集操作已完成。
如果在事件处理程序中设置窗口可视属性,然后在离开事件处理程序之前从管理窗口的线程中删除所有执行,则不会处理消息。
不要在GUI事件处理程序中等待。它是处理消息的状态机。不要阻止它。
答案 2 :(得分:0)
感谢您的贡献! 关于线程的建议很有帮助。我用Refresh()函数解决了这个问题。似乎部分代码是用不同的线程处理的,这些线程是异步的。 Refresh()函数可能通过synchronized实现等待线程。