【问题标题】:Adding a delay in my code, not working. C++在我的代码中添加延迟,不起作用。 C++
【发布时间】:2015-05-23 11:06:07
【问题描述】:

试图让西蒙说游戏作为我的学期项目,问题是当颜色变化时我不能在颜色之间添加延迟, 即我想添加一个延迟,以便当一个框颜色发生变化时,大约 3~4 秒后下一个框颜色发生变化,但问题是 当我将 Sleep() 放入我的 for 循环时,系统暂停对于整体给出的数量,然后显示所有同时更改的颜色,而不是一个一个....

任何帮助,这是我在单击游戏的开始按钮时调用的函数。如何解决?

void flash()
    {
        srand(time(NULL));

        int x;
        for (int i = 5; i > 0;i--)
        {
            x = rand() % 4;

            if (x == 0)
            {
                button1->BackColor = System::Drawing::Color::Blue;
            }
            else if (x == 1)
            {
                button2->BackColor = System::Drawing::Color::Blue;
            }
            else    if (x == 2)
            {
                button3->BackColor = System::Drawing::Color::Blue;
            }
            else    if (x == 3)
            {
                button4->BackColor = System::Drawing::Color::Blue;
            }
            Sleep(500);
        }
    }

P.s 我试图在 if 语句中设置睡眠,但这也不起作用,请问有什么帮助吗?

【问题讨论】:

  • 您需要以某种方式刷新视图。需要有关您正在使用的 UI 框架的更多信息。
  • @Nattrass:只是格式很差 - Sleep 实际上在 for 循环内。
  • Refresh() 每次更改后的按钮控件,但这不是做这些事情的正确方法。 UI 将冻结。启动一个任务,休眠并将颜色更改发送到 ui 线程。顺便说一句...混合 NET 和 CRT 的理由?
  • @MarcoA。 .好吧,我正在使用 C++ 开发 Windows 窗体应用程序,而我刚刚编程,第一学期,这是一个项目。 + 我是个菜鸟 ._.
  • @AdrianoRepetti,所以我应该在每次更改后添加 Refresh() 按钮以刷新 UI 吗?我使用 CRT 的原因是我们的老师告诉我们在上面制作游戏,使用已经预先制作的按钮。

标签: windows winforms c++-cli delay


【解决方案1】:

由于您的代码是单线程的并且您正在循环中更新按钮的颜色,因此(当前)应用程序的标准绘图例程没有机会启动,直到循环完成。如果您确实想要在循环中重绘,则必须通过(例如)手动发出它:

button1->Invalidate();
button1->Update();

请注意,如果您在循环中停留的时间过长,Windows 确实会识别出您的应用程序没有响应 Windows 消息并使其“无响应”(窗口淡化为半白色)。为了避免这种情况,您可以使用 System::Windows::Forms 中的 Timer 类来实现延迟行为。

【讨论】:

    猜你喜欢
    • 2014-08-31
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多