C++ 函数 Sleep() 在一段代码之前执行

Posted

技术标签:

【中文标题】C++ 函数 Sleep() 在一段代码之前执行【英文标题】:C++ function Sleep() executes before piece of code 【发布时间】:2016-05-25 07:30:42 【问题描述】:

我在 Visual Studio 中使用 C++、Windows 窗体应用程序工作。我尝试将按钮涂成红色,等待 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 控制台脚本中运行良好。你有什么解决办法吗?

【问题讨论】:

我假设您正在让主线程进入睡眠状态,因此它没有时间将背景颜色更新为红色。 休眠功能停止程序执行一段时间。在您的情况下,它发生在绘图调用之前。您需要使用在每次绘制调用后运行的更新函数 按钮需要被强制重绘——默认情况下,出于性能原因,它不会立即这样做,并且调用Sleep()会在此之前暂停线程。如果您使用的是 .NET - 您还没有说清楚 - 请尝试在调用 Sleep() 之前添加 button1-&gt;Refresh() 【参考方案1】:

由于 Button 也是一个窗口,您可以在调用 Sleep() 之前使其无效。what is invalidate,update methods do in VC++

【讨论】:

【参考方案2】:

设置组件属性,例如'button1->BackColor = System::Drawing::Color::DarkRed;'不是微不足道的任务。 setter 方法生成消息或消息序列,这些消息或消息序列发布到实现 GUI 的 Windows/线程。必须先处理这些消息,然后才能将请求的属性设置操作视为已完成。

如果您在事件处理程序中设置窗口视觉属性,然后在离开事件处理程序之前从管理窗口的线程中删除所有执行,则不会处理消息。

不要在 GUI 事件处理程序中等待。它是用于处理消息的状态机。不要停下来。

【讨论】:

【参考方案3】:

感谢你们的贡献! 关于线程的建议很有帮助。我已经用 Refresh() 函数解决了这个问题。似乎部分代码是由异步工作的不同线程处理的。 Refresh() 函数可能实现等待线程同步。

【讨论】:

以上是关于C++ 函数 Sleep() 在一段代码之前执行的主要内容,如果未能解决你的问题,请参考以下文章

c ++:为啥执行回调但回调定义之前的函数没有?

操作系统多线程多进程

javascript执行上下文环境

sleep()函数的的意义

OS X 上的 C++ 中的睡眠操作

lua脚本延迟10秒怎么写