【问题标题】:Add delay to code execution in C++在 C++ 中为代码执行添加延迟
【发布时间】:2014-08-31 00:16:18
【问题描述】:

假设我需要调用一个延迟 2 秒的函数。在 cocos2d-x 中你可以使用动作:

auto action = Sequence::create(
    DelayTime::create(2), 
    CallFunc::create(
        [&]() {
            // here is the lambda function that does whatever you want after 2 seconds
        }
    ), 
    NULL
);

runAction(action);

但要运行该操作,您需要一个 Node,它并不总是可用的。有些类与Node 无关。 所以我想知道在 C++11 中增加代码执行延迟的跨平台方式是什么?

【问题讨论】:

  • 要添加到下面的@Shaktal 答案,我将 std::thread 子类化,这样我就可以使用自定义变量等实现,我用这些变量来决定线程的状态,如何处理它,等等。我还在游戏启动时创建了一堆线程,在特定时间运行特定任务。
  • @GameDeveloper 我不明白你的意思,抱歉。
  • 你不明白什么?也许看看这个:solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial

标签: c++ cocos2d-x delay cocos2d-x-3.0


【解决方案1】:

看起来这个问题已经结束了,无论如何你可以使用调度器来安排你的方法在 Cocos2dx 中随时被调用。 在您的类 init 方法中,在返回 true 之前执行类似的操作。

this->schedule(schedule_selector(HelloWorld::setGamePlaySpeed), .2);

并创建一个方法给它float dt作为这样的参数..

void HelloWorld::setGamePlaySpeed(float dt){
 // do anything yo want... This method will be Called every .2 seconds
 }

现在 float dt 是您在调度程序中指定的 dt 时间。 希望这可以帮助任何在未来寻找相同问题的人......

【讨论】:

  • 如果您的类派生自Node,这是一个好方法。但是如果你没有得到它呢?你只是有一个任意的类。在这种情况下,您可以使用Node 的实例吗?
  • 您也可以尝试以毫秒为单位获取系统时间,然后在设定的时间范围内调用任意类中的函数。您可以执行类似的操作以毫秒为单位获取系统时间。 static inline long millisecondNow() { struct cc_timeval now; CCTime::gettimeofdayCocos2d(&now, NULL);返回(now.tv_sec * 1000 + now.tv_usec / 1000); }
  • 您如何使用pThread。是跨平台吗?它是否像std::this_thread::sleep_for( duration ); 的情况一样冻结主线程
  • GameDeveloper 在上面分享了一个显示如何使用线程的链接,我不明白你想用这个实现什么,如果你想停止整个游戏的执行(没有指定的逻辑调用time) 那么您可以在我的 cmets 中使用上述方法并暂停/恢复 Director 似乎合适,如果您只想每隔几个时间帧调用一个方法,那么您也可以使用相同的方法来完成
  • 我在显示启动画面后异步加载资产。然后我看看加载完成后经过了多少时间。如果小于 2 秒,我想等待2 - duration 秒以保留启动画面。只有这样我才想换个场景。
【解决方案2】:

你可以使用 usleep 功能。

为此你必须包括

#include <unistd.h>

在你的课堂上,如果你需要暂停,你可以像这样设置 usleep 函数。

usleep(5000000);

然后调用你需要运行的函数。

这将使您的游戏循环进入 5 秒睡眠模式。

【讨论】:

  • 这是标准吗?我以为这只是 UNIX。
【解决方案3】:

可以使用C++11线程库中添加的std::this_thread::sleep_for函数:

std::chrono::seconds duration( 2 ); 
std::this_thread::sleep_for( duration ); // Sleep for 2 seconds.

这将导致当前线程在duration 对象中指定的持续时间内暂停执行。

【讨论】:

  • 有没有更好的办法? Windows 在鼠标上显示一个圆圈,就好像窗口被冻结了一样。
  • 嗯,是的,如果你正在执行它,这将暂停主线程的执行。
  • 有没有办法增加异步延迟?
  • 这是一个糟糕的建议。
  • 在新线程中执行此操作并在延迟后在主线程上触发回调
猜你喜欢
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多