add Ticker & EventTicker
This commit is contained in:
parent
fed74ddb0a
commit
1805c016f8
|
|
@ -17,6 +17,7 @@
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Cloneable.h" />
|
<ClInclude Include="..\..\src\kiwano\core\Cloneable.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Common.h" />
|
<ClInclude Include="..\..\src\kiwano\core\Common.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Director.h" />
|
<ClInclude Include="..\..\src\kiwano\core\Director.h" />
|
||||||
|
<ClInclude Include="..\..\src\kiwano\core\EventTicker.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\event\Event.h" />
|
<ClInclude Include="..\..\src\kiwano\core\event\Event.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\event\EventType.h" />
|
<ClInclude Include="..\..\src\kiwano\core\event\EventType.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\event\KeyEvent.h" />
|
<ClInclude Include="..\..\src\kiwano\core\event\KeyEvent.h" />
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Serializable.h" />
|
<ClInclude Include="..\..\src\kiwano\core\Serializable.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Singleton.h" />
|
<ClInclude Include="..\..\src\kiwano\core\Singleton.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\String.h" />
|
<ClInclude Include="..\..\src\kiwano\core\String.h" />
|
||||||
|
<ClInclude Include="..\..\src\kiwano\core\Ticker.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Time.h" />
|
<ClInclude Include="..\..\src\kiwano\core\Time.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Timer.h" />
|
<ClInclude Include="..\..\src\kiwano\core\Timer.h" />
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Xml.h" />
|
<ClInclude Include="..\..\src\kiwano\core\Xml.h" />
|
||||||
|
|
@ -124,6 +126,7 @@
|
||||||
<ClCompile Include="..\..\src\kiwano\2d\TextActor.cpp" />
|
<ClCompile Include="..\..\src\kiwano\2d\TextActor.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\2d\Transition.cpp" />
|
<ClCompile Include="..\..\src\kiwano\2d\Transition.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\Allocator.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\Allocator.cpp" />
|
||||||
|
<ClCompile Include="..\..\src\kiwano\core\EventTicker.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\Module.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\Module.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\Director.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\Director.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\EventDispatcher.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\EventDispatcher.cpp" />
|
||||||
|
|
@ -139,6 +142,7 @@
|
||||||
<ClCompile Include="..\..\src\kiwano\core\RefCounter.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\RefCounter.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\Resource.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\Resource.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\String.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\String.cpp" />
|
||||||
|
<ClCompile Include="..\..\src\kiwano\core\Ticker.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\Time.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\Time.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\Task.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\Task.cpp" />
|
||||||
<ClCompile Include="..\..\src\kiwano\core\TaskManager.cpp" />
|
<ClCompile Include="..\..\src\kiwano\core\TaskManager.cpp" />
|
||||||
|
|
|
||||||
|
|
@ -330,6 +330,12 @@
|
||||||
<ClInclude Include="..\..\src\kiwano\core\Timer.h">
|
<ClInclude Include="..\..\src\kiwano\core\Timer.h">
|
||||||
<Filter>core</Filter>
|
<Filter>core</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\kiwano\core\Ticker.h">
|
||||||
|
<Filter>core</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\kiwano\core\EventTicker.h">
|
||||||
|
<Filter>core</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\kiwano\2d\Canvas.cpp">
|
<ClCompile Include="..\..\src\kiwano\2d\Canvas.cpp">
|
||||||
|
|
@ -545,6 +551,12 @@
|
||||||
<ClCompile Include="..\..\src\kiwano\core\Timer.cpp">
|
<ClCompile Include="..\..\src\kiwano\core\Timer.cpp">
|
||||||
<Filter>core</Filter>
|
<Filter>core</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\kiwano\core\Ticker.cpp">
|
||||||
|
<Filter>core</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\kiwano\core\EventTicker.cpp">
|
||||||
|
<Filter>core</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="suppress_warning.ruleset" />
|
<None Include="suppress_warning.ruleset" />
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
#include <kiwano/core/EventTicker.h>
|
||||||
|
|
||||||
|
namespace kiwano
|
||||||
|
{
|
||||||
|
|
||||||
|
TickEvent::TickEvent()
|
||||||
|
: Event(KGE_EVENT(TickEvent))
|
||||||
|
, ticker_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
EventTickerPtr EventTicker::Create(Duration interval, int times)
|
||||||
|
{
|
||||||
|
EventTickerPtr ptr = memory::New<EventTicker>();
|
||||||
|
if (ptr)
|
||||||
|
{
|
||||||
|
ptr->SetInterval(interval);
|
||||||
|
ptr->SetTotalTickTimes(times);
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EventTicker::Tick(Duration dt)
|
||||||
|
{
|
||||||
|
if (Ticker::Tick(dt))
|
||||||
|
{
|
||||||
|
TickEventPtr evt = new TickEvent;
|
||||||
|
evt->delta_time_ = GetDeltaTime();
|
||||||
|
evt->ticker_ = this;
|
||||||
|
DispatchEvent(evt.Get());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace kiwano
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <kiwano/core/Ticker.h>
|
||||||
|
#include <kiwano/core/EventDispatcher.h>
|
||||||
|
#include <kiwano/core/event/Event.h>
|
||||||
|
|
||||||
|
namespace kiwano
|
||||||
|
{
|
||||||
|
|
||||||
|
KGE_DECLARE_SMART_PTR(TickEvent);
|
||||||
|
KGE_DECLARE_SMART_PTR(EventTicker);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup Events
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 报时时间
|
||||||
|
class KGE_API TickEvent : public Event
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TickEvent();
|
||||||
|
|
||||||
|
EventTicker* ticker_;
|
||||||
|
Duration delta_time_;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 事件报时器
|
||||||
|
class KGE_API EventTicker
|
||||||
|
: public Ticker
|
||||||
|
, public EventDispatcher
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 创建事件报时器
|
||||||
|
/// @param interval 报时间隔
|
||||||
|
/// @param times 报时次数(设 -1 为永久)
|
||||||
|
static EventTickerPtr Create(Duration interval, int times = -1);
|
||||||
|
|
||||||
|
bool Tick(Duration dt) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace kiwano
|
||||||
|
|
@ -22,75 +22,74 @@
|
||||||
|
|
||||||
namespace kiwano
|
namespace kiwano
|
||||||
{
|
{
|
||||||
|
TaskPtr Task::Create(const Callback& cb, TickerPtr ticker)
|
||||||
TaskPtr Task::Create(const Callback& cb, Duration interval, int times)
|
|
||||||
{
|
{
|
||||||
TaskPtr ptr = memory::New<Task>();
|
TaskPtr ptr = memory::New<Task>();
|
||||||
if (ptr)
|
if (ptr)
|
||||||
{
|
{
|
||||||
ptr->SetCallback(cb);
|
ptr->SetCallback(cb);
|
||||||
ptr->SetInterval(interval);
|
ptr->SetTicker(ticker);
|
||||||
ptr->SetTotalRunTimes(times);
|
|
||||||
}
|
}
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskPtr Task::Create(const String& name, const Callback& cb, Duration interval, int times)
|
TaskPtr Task::Create(const String& name, const Callback& cb, TickerPtr ticker)
|
||||||
{
|
{
|
||||||
TaskPtr ptr = memory::New<Task>();
|
TaskPtr ptr = Task::Create(cb, ticker);
|
||||||
if (ptr)
|
if (ptr)
|
||||||
{
|
{
|
||||||
ptr->SetName(name);
|
ptr->SetName(name);
|
||||||
ptr->SetCallback(cb);
|
|
||||||
ptr->SetInterval(interval);
|
|
||||||
ptr->SetTotalRunTimes(times);
|
|
||||||
}
|
}
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TaskPtr Task::Create(const Callback& cb, Duration interval, int times)
|
||||||
|
{
|
||||||
|
TickerPtr ticker = Ticker::Create(interval, times);
|
||||||
|
return Task::Create(cb, ticker);
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskPtr Task::Create(const String& name, const Callback& cb, Duration interval, int times)
|
||||||
|
{
|
||||||
|
TickerPtr ticker = Ticker::Create(interval, times);
|
||||||
|
return Task::Create(name, cb, ticker);
|
||||||
|
}
|
||||||
|
|
||||||
Task::Task()
|
Task::Task()
|
||||||
: running_(true)
|
: running_(true)
|
||||||
, removeable_(false)
|
, removeable_(false)
|
||||||
, run_times_(0)
|
|
||||||
, total_times_(0)
|
|
||||||
, interval_(0)
|
|
||||||
, elapsed_(0)
|
|
||||||
, callback_()
|
, callback_()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Task::Update(Duration dt)
|
void Task::Update(Duration dt)
|
||||||
{
|
{
|
||||||
if (total_times_ == 0)
|
if (!ticker_)
|
||||||
{
|
{
|
||||||
Remove();
|
Remove();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsRunning())
|
if (ticker_->GetTotalTickTimes() == 0)
|
||||||
{
|
{
|
||||||
if (!interval_.IsZero())
|
Remove();
|
||||||
{
|
return;
|
||||||
elapsed_ += dt;
|
}
|
||||||
if (elapsed_ < interval_)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (ticker_->Tick(dt))
|
||||||
|
{
|
||||||
if (callback_)
|
if (callback_)
|
||||||
callback_(this, elapsed_);
|
callback_(this, ticker_->GetDeltaTime());
|
||||||
|
|
||||||
++run_times_;
|
if (ticker_->GetTickedTimes() == ticker_->GetTotalTickTimes())
|
||||||
elapsed_ = 0;
|
|
||||||
|
|
||||||
if (run_times_ == total_times_)
|
|
||||||
Remove();
|
Remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Task::Reset()
|
void Task::Reset()
|
||||||
{
|
{
|
||||||
elapsed_ = 0;
|
if (ticker_)
|
||||||
run_times_ = 0;
|
ticker_->Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace kiwano
|
} // namespace kiwano
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,7 @@
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <kiwano/core/ObjectBase.h>
|
#include <kiwano/core/Ticker.h>
|
||||||
#include <kiwano/core/Time.h>
|
|
||||||
#include <kiwano/core/IntrusiveList.h>
|
#include <kiwano/core/IntrusiveList.h>
|
||||||
|
|
||||||
namespace kiwano
|
namespace kiwano
|
||||||
|
|
@ -47,9 +46,22 @@ public:
|
||||||
/// \~chinese
|
/// \~chinese
|
||||||
/// @brief 任务回调函数
|
/// @brief 任务回调函数
|
||||||
/// @details
|
/// @details
|
||||||
/// 回调函数第一个参数是任务自身,第二个参数是距离上次执行任务的时间间隔
|
/// 回调函数第一个参数是任务自身,第二个参数是时间增量
|
||||||
using Callback = Function<void(Task* /* self */, Duration /* dt */)>;
|
using Callback = Function<void(Task* /* self */, Duration /* dt */)>;
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 创建任务
|
||||||
|
/// @param cb 回调函数
|
||||||
|
/// @param 报时器
|
||||||
|
static TaskPtr Create(const Callback& cb, TickerPtr ticker);
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 创建任务
|
||||||
|
/// @param name 名称
|
||||||
|
/// @param cb 回调函数
|
||||||
|
/// @param 报时器
|
||||||
|
static TaskPtr Create(const String& name, const Callback& cb, TickerPtr ticker);
|
||||||
|
|
||||||
/// \~chinese
|
/// \~chinese
|
||||||
/// @brief 创建任务
|
/// @brief 创建任务
|
||||||
/// @param cb 回调函数
|
/// @param cb 回调函数
|
||||||
|
|
@ -89,26 +101,6 @@ public:
|
||||||
/// @brief 任务是否可移除
|
/// @brief 任务是否可移除
|
||||||
bool IsRemoveable() const;
|
bool IsRemoveable() const;
|
||||||
|
|
||||||
/// \~chinese
|
|
||||||
/// @brief 获取任务执行过回调函数的次数
|
|
||||||
int GetRunTimes() const;
|
|
||||||
|
|
||||||
/// \~chinese
|
|
||||||
/// @brief 获取任务执行回调函数的总次数
|
|
||||||
int GetTotalRunTimes() const;
|
|
||||||
|
|
||||||
/// \~chinese
|
|
||||||
/// @brief 设置任务执行回调函数的总次数
|
|
||||||
void SetTotalRunTimes(int times);
|
|
||||||
|
|
||||||
/// \~chinese
|
|
||||||
/// @brief 获取任务执行时间间隔
|
|
||||||
Duration GetInterval() const;
|
|
||||||
|
|
||||||
/// \~chinese
|
|
||||||
/// @brief 设置任务执行时间间隔
|
|
||||||
void SetInterval(Duration interval);
|
|
||||||
|
|
||||||
/// \~chinese
|
/// \~chinese
|
||||||
/// @brief 获取任务回调函数
|
/// @brief 获取任务回调函数
|
||||||
Callback GetCallback() const;
|
Callback GetCallback() const;
|
||||||
|
|
@ -117,6 +109,14 @@ public:
|
||||||
/// @brief 设置任务回调函数
|
/// @brief 设置任务回调函数
|
||||||
void SetCallback(const Callback& callback);
|
void SetCallback(const Callback& callback);
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取任务的报时器
|
||||||
|
TickerPtr GetTicker() const;
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 设置任务的报时器
|
||||||
|
void SetTicker(TickerPtr ticker);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// \~chinese
|
/// \~chinese
|
||||||
/// @brief 更新任务
|
/// @brief 更新任务
|
||||||
|
|
@ -127,13 +127,10 @@ private:
|
||||||
void Reset();
|
void Reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool running_;
|
bool running_;
|
||||||
bool removeable_;
|
bool removeable_;
|
||||||
int run_times_;
|
TickerPtr ticker_;
|
||||||
int total_times_;
|
Callback callback_;
|
||||||
Duration interval_;
|
|
||||||
Duration elapsed_;
|
|
||||||
Callback callback_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void Task::Start()
|
inline void Task::Start()
|
||||||
|
|
@ -161,29 +158,14 @@ inline bool Task::IsRemoveable() const
|
||||||
return removeable_;
|
return removeable_;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int Task::GetRunTimes() const
|
inline TickerPtr Task::GetTicker() const
|
||||||
{
|
{
|
||||||
return run_times_;
|
return ticker_;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int Task::GetTotalRunTimes() const
|
inline void Task::SetTicker(TickerPtr ticker)
|
||||||
{
|
{
|
||||||
return total_times_;
|
ticker_ = ticker;
|
||||||
}
|
|
||||||
|
|
||||||
inline void Task::SetTotalRunTimes(int times)
|
|
||||||
{
|
|
||||||
total_times_ = times;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Duration Task::GetInterval() const
|
|
||||||
{
|
|
||||||
return interval_;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void Task::SetInterval(Duration interval)
|
|
||||||
{
|
|
||||||
interval_ = interval;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Task::Callback Task::GetCallback() const
|
inline Task::Callback Task::GetCallback() const
|
||||||
|
|
|
||||||
|
|
@ -40,17 +40,6 @@ void TaskManager::UpdateTasks(Duration dt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Task* TaskManager::AddTask(const Task::Callback& cb, Duration interval, int times)
|
|
||||||
{
|
|
||||||
return AddTask(String(), cb, interval, times);
|
|
||||||
}
|
|
||||||
|
|
||||||
Task* TaskManager::AddTask(const String& name, const Task::Callback& cb, Duration interval, int times)
|
|
||||||
{
|
|
||||||
TaskPtr task = Task::Create(name, cb, interval, times);
|
|
||||||
return AddTask(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
Task* TaskManager::AddTask(TaskPtr task)
|
Task* TaskManager::AddTask(TaskPtr task)
|
||||||
{
|
{
|
||||||
KGE_ASSERT(task && "AddTask failed, NULL pointer exception");
|
KGE_ASSERT(task && "AddTask failed, NULL pointer exception");
|
||||||
|
|
|
||||||
|
|
@ -30,21 +30,6 @@ namespace kiwano
|
||||||
class KGE_API TaskManager
|
class KGE_API TaskManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// \~chinese
|
|
||||||
/// @brief 添加任务
|
|
||||||
/// @param cb 回调函数
|
|
||||||
/// @param interval 时间间隔
|
|
||||||
/// @param times 执行次数(设 -1 为永久执行)
|
|
||||||
Task* AddTask(const Task::Callback& cb, Duration interval, int times = -1);
|
|
||||||
|
|
||||||
/// \~chinese
|
|
||||||
/// @brief 添加任务
|
|
||||||
/// @param name 任务名称
|
|
||||||
/// @param cb 回调函数
|
|
||||||
/// @param interval 时间间隔
|
|
||||||
/// @param times 执行次数(设 -1 为永久执行)
|
|
||||||
Task* AddTask(const String& name, const Task::Callback& cb, Duration interval, int times = -1);
|
|
||||||
|
|
||||||
/// \~chinese
|
/// \~chinese
|
||||||
/// @brief Ìí¼ÓÈÎÎñ
|
/// @brief Ìí¼ÓÈÎÎñ
|
||||||
Task* AddTask(TaskPtr task);
|
Task* AddTask(TaskPtr task);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
#include <kiwano/core/Ticker.h>
|
||||||
|
|
||||||
|
namespace kiwano
|
||||||
|
{
|
||||||
|
|
||||||
|
TickerPtr Ticker::Create(Duration interval, int times)
|
||||||
|
{
|
||||||
|
TickerPtr ptr = memory::New<Ticker>();
|
||||||
|
if (ptr)
|
||||||
|
{
|
||||||
|
ptr->SetInterval(interval);
|
||||||
|
ptr->SetTotalTickTimes(times);
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ticker::Ticker()
|
||||||
|
: ticked_times_(0)
|
||||||
|
, total_times_(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Ticker::Tick()
|
||||||
|
{
|
||||||
|
if (!timer_)
|
||||||
|
timer_ = Timer::Create();
|
||||||
|
|
||||||
|
if (timer_->IsPausing())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
timer_->Tick();
|
||||||
|
|
||||||
|
return this->Tick(timer_->GetDeltaTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Ticker::Tick(Duration dt)
|
||||||
|
{
|
||||||
|
if (ticked_times_ == total_times_)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
elapsed_time_ += dt;
|
||||||
|
|
||||||
|
if (elapsed_time_ + error_time_ > interval_)
|
||||||
|
{
|
||||||
|
delta_time_ = elapsed_time_;
|
||||||
|
error_time_ = (elapsed_time_ + error_time_) - interval_;
|
||||||
|
elapsed_time_ = 0;
|
||||||
|
++ticked_times_;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Duration Ticker::GetDeltaTime()
|
||||||
|
{
|
||||||
|
return delta_time_;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimerPtr Ticker::GetTimer()
|
||||||
|
{
|
||||||
|
return timer_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ticker::SetTimer(TimerPtr timer)
|
||||||
|
{
|
||||||
|
timer_ = timer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ticker::Reset()
|
||||||
|
{
|
||||||
|
if (timer_)
|
||||||
|
timer_->Reset();
|
||||||
|
|
||||||
|
elapsed_time_ = 0;
|
||||||
|
delta_time_ = 0;
|
||||||
|
error_time_ = 0;
|
||||||
|
ticked_times_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace kiwano
|
||||||
|
|
@ -0,0 +1,156 @@
|
||||||
|
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <kiwano/core/Timer.h>
|
||||||
|
|
||||||
|
namespace kiwano
|
||||||
|
{
|
||||||
|
|
||||||
|
KGE_DECLARE_SMART_PTR(Ticker);
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 报时器
|
||||||
|
class KGE_API Ticker
|
||||||
|
: public ObjectBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 创建报时器
|
||||||
|
/// @param interval 报时间隔
|
||||||
|
/// @param times 报时次数(设 -1 为永久)
|
||||||
|
static TickerPtr Create(Duration interval, int times = -1);
|
||||||
|
|
||||||
|
Ticker();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 计时
|
||||||
|
/// @return 是否达到报时时长
|
||||||
|
virtual bool Tick();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 计时
|
||||||
|
/// @param dt 时间增量
|
||||||
|
/// @return 是否达到报时时长
|
||||||
|
virtual bool Tick(Duration dt);
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取时间增量
|
||||||
|
Duration GetDeltaTime();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取暂停状态
|
||||||
|
bool IsPausing() const;
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 暂停报时器
|
||||||
|
void Pause();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 继续报时器
|
||||||
|
void Resume();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取报时器报时次数
|
||||||
|
int GetTickedTimes() const;
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取报时器总报时次数
|
||||||
|
int GetTotalTickTimes() const;
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 设置报时器总报时次数
|
||||||
|
void SetTotalTickTimes(int times);
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取报时间隔
|
||||||
|
Duration GetInterval() const;
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 设置报时间隔
|
||||||
|
void SetInterval(Duration interval);
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取计时器
|
||||||
|
TimerPtr GetTimer();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 设置计时器
|
||||||
|
void SetTimer(TimerPtr timer);
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 重置报时器
|
||||||
|
void Reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int ticked_times_;
|
||||||
|
int total_times_;
|
||||||
|
Duration interval_;
|
||||||
|
Duration elapsed_time_;
|
||||||
|
Duration delta_time_;
|
||||||
|
Duration error_time_;
|
||||||
|
TimerPtr timer_;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline void Ticker::Pause()
|
||||||
|
{
|
||||||
|
KGE_ASSERT(timer_);
|
||||||
|
timer_->Pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Ticker::Resume()
|
||||||
|
{
|
||||||
|
KGE_ASSERT(timer_);
|
||||||
|
timer_->Resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Ticker::IsPausing() const
|
||||||
|
{
|
||||||
|
if (timer_)
|
||||||
|
return timer_->IsPausing();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int Ticker::GetTickedTimes() const
|
||||||
|
{
|
||||||
|
return ticked_times_;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int Ticker::GetTotalTickTimes() const
|
||||||
|
{
|
||||||
|
return total_times_;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Ticker::SetTotalTickTimes(int times)
|
||||||
|
{
|
||||||
|
total_times_ = times;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Duration Ticker::GetInterval() const
|
||||||
|
{
|
||||||
|
return interval_;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Ticker::SetInterval(Duration interval)
|
||||||
|
{
|
||||||
|
interval_ = interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace kiwano
|
||||||
|
|
@ -19,13 +19,21 @@
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
#include <kiwano/core/Timer.h>
|
#include <kiwano/core/Timer.h>
|
||||||
|
#include <kiwano/core/Allocator.h>
|
||||||
|
|
||||||
namespace kiwano
|
namespace kiwano
|
||||||
{
|
{
|
||||||
|
|
||||||
Timer::Timer()
|
TimerPtr Timer::Create()
|
||||||
: is_stopped_(false)
|
|
||||||
{
|
{
|
||||||
|
TimerPtr ptr = memory::New<Timer>();
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer::Timer()
|
||||||
|
: is_paused_(false)
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
Timer::~Timer() {}
|
Timer::~Timer() {}
|
||||||
|
|
@ -37,42 +45,19 @@ Duration Timer::GetDeltaTime() const
|
||||||
|
|
||||||
Duration Timer::GetTotalTime() const
|
Duration Timer::GetTotalTime() const
|
||||||
{
|
{
|
||||||
if (is_stopped_)
|
if (is_paused_)
|
||||||
return paused_time_ - start_time_ - total_idle_time_;
|
return paused_time_ - start_time_ - total_idle_time_;
|
||||||
return current_time_ - start_time_ - total_idle_time_;
|
return current_time_ - start_time_ - total_idle_time_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer::Start()
|
bool Timer::IsPausing() const
|
||||||
{
|
{
|
||||||
if (is_stopped_)
|
return is_paused_;
|
||||||
{
|
|
||||||
const auto now = Time::Now();
|
|
||||||
|
|
||||||
// add the duration of the pause to the total idle time
|
|
||||||
total_idle_time_ += (now - paused_time_);
|
|
||||||
|
|
||||||
// set the previous time to the current time
|
|
||||||
previous_time_ = now;
|
|
||||||
|
|
||||||
paused_time_ = Time();
|
|
||||||
is_stopped_ = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Timer::Stop()
|
|
||||||
{
|
|
||||||
if (!is_stopped_)
|
|
||||||
{
|
|
||||||
const auto now = Time::Now();
|
|
||||||
|
|
||||||
paused_time_ = now;
|
|
||||||
is_stopped_ = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer::Tick()
|
void Timer::Tick()
|
||||||
{
|
{
|
||||||
if (is_stopped_)
|
if (is_paused_)
|
||||||
{
|
{
|
||||||
delta_time_ = 0;
|
delta_time_ = 0;
|
||||||
return;
|
return;
|
||||||
|
|
@ -91,14 +76,44 @@ void Timer::Tick()
|
||||||
delta_time_ = 0;
|
delta_time_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Timer::Resume()
|
||||||
|
{
|
||||||
|
if (is_paused_)
|
||||||
|
{
|
||||||
|
const auto now = Time::Now();
|
||||||
|
|
||||||
|
// add the duration of the pause to the total idle time
|
||||||
|
total_idle_time_ += (now - paused_time_);
|
||||||
|
|
||||||
|
// set the previous time to the current time
|
||||||
|
previous_time_ = now;
|
||||||
|
|
||||||
|
paused_time_ = Time();
|
||||||
|
is_paused_ = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Timer::Pause()
|
||||||
|
{
|
||||||
|
if (!is_paused_)
|
||||||
|
{
|
||||||
|
const auto now = Time::Now();
|
||||||
|
|
||||||
|
paused_time_ = now;
|
||||||
|
is_paused_ = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Timer::Reset()
|
void Timer::Reset()
|
||||||
{
|
{
|
||||||
const auto now = Time::Now();
|
const auto now = Time::Now();
|
||||||
|
|
||||||
start_time_ = now;
|
start_time_ = now;
|
||||||
|
current_time_ = now;
|
||||||
previous_time_ = now;
|
previous_time_ = now;
|
||||||
paused_time_ = Time();
|
paused_time_ = Time();
|
||||||
is_stopped_ = false;
|
delta_time_ = 0;
|
||||||
|
is_paused_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace kiwano
|
} // namespace kiwano
|
||||||
|
|
|
||||||
|
|
@ -27,28 +27,50 @@ namespace kiwano
|
||||||
|
|
||||||
KGE_DECLARE_SMART_PTR(Timer);
|
KGE_DECLARE_SMART_PTR(Timer);
|
||||||
|
|
||||||
class Timer
|
/// \~chinese
|
||||||
|
/// @brief 计时器
|
||||||
|
class KGE_API Timer
|
||||||
: public ObjectBase
|
: public ObjectBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 创建计时器
|
||||||
|
static TimerPtr Create();
|
||||||
|
|
||||||
Timer();
|
Timer();
|
||||||
|
|
||||||
virtual ~Timer();
|
virtual ~Timer();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取时间增量
|
||||||
Duration GetDeltaTime() const;
|
Duration GetDeltaTime() const;
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 获取总时长
|
||||||
Duration GetTotalTime() const;
|
Duration GetTotalTime() const;
|
||||||
|
|
||||||
void Start();
|
/// \~chinese
|
||||||
|
/// @brief 获取暂停状态
|
||||||
void Stop();
|
bool IsPausing() const;
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 计时
|
||||||
void Tick();
|
void Tick();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 继续计时
|
||||||
|
void Resume();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 暂停计时
|
||||||
|
void Pause();
|
||||||
|
|
||||||
|
/// \~chinese
|
||||||
|
/// @brief 重置计时器
|
||||||
void Reset();
|
void Reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool is_stopped_;
|
bool is_paused_;
|
||||||
Time start_time_;
|
Time start_time_;
|
||||||
Time paused_time_;
|
Time paused_time_;
|
||||||
Time current_time_;
|
Time current_time_;
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,9 @@
|
||||||
#include <kiwano/core/Resource.h>
|
#include <kiwano/core/Resource.h>
|
||||||
#include <kiwano/core/SmartPtr.hpp>
|
#include <kiwano/core/SmartPtr.hpp>
|
||||||
#include <kiwano/core/Time.h>
|
#include <kiwano/core/Time.h>
|
||||||
|
#include <kiwano/core/Timer.h>
|
||||||
|
#include <kiwano/core/Ticker.h>
|
||||||
|
#include <kiwano/core/EventTicker.h>
|
||||||
#include <kiwano/core/Task.h>
|
#include <kiwano/core/Task.h>
|
||||||
#include <kiwano/core/TaskManager.h>
|
#include <kiwano/core/TaskManager.h>
|
||||||
#include <kiwano/core/event/Event.h>
|
#include <kiwano/core/event/Event.h>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue