<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.cheatengine.org/index.php?action=history&amp;feed=atom&amp;title=Lua%3AcreateTimer</id>
	<title>Lua:createTimer - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cheatengine.org/index.php?action=history&amp;feed=atom&amp;title=Lua%3AcreateTimer"/>
	<link rel="alternate" type="text/html" href="https://wiki.cheatengine.org/index.php?title=Lua:createTimer&amp;action=history"/>
	<updated>2026-05-01T10:22:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://wiki.cheatengine.org/index.php?title=Lua:createTimer&amp;diff=7759&amp;oldid=prev</id>
		<title>Mr millchick: Created page with &quot;Category:Lua '''function''' createTimer(''owner'' OPTIONAL, ''enabled'' OPTIONAL) : '''Timer'''  '''function''' createTimer(''interval'', ''callback'', ''...'' OPTIONAL) :...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.cheatengine.org/index.php?title=Lua:createTimer&amp;diff=7759&amp;oldid=prev"/>
		<updated>2025-10-25T05:12:37Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;a href=&quot;/index.php?title=Category:Lua&quot; title=&quot;Category:Lua&quot;&gt;Category:Lua&lt;/a&gt; &amp;#039;&amp;#039;&amp;#039;function&amp;#039;&amp;#039;&amp;#039; createTimer(&amp;#039;&amp;#039;owner&amp;#039;&amp;#039; OPTIONAL, &amp;#039;&amp;#039;enabled&amp;#039;&amp;#039; OPTIONAL) : &amp;#039;&amp;#039;&amp;#039;Timer&amp;#039;&amp;#039;&amp;#039;  &amp;#039;&amp;#039;&amp;#039;function&amp;#039;&amp;#039;&amp;#039; createTimer(&amp;#039;&amp;#039;interval&amp;#039;&amp;#039;, &amp;#039;&amp;#039;callback&amp;#039;&amp;#039;, &amp;#039;&amp;#039;...&amp;#039;&amp;#039; OPTIONAL) :...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Lua]]&lt;br /&gt;
'''function''' createTimer(''owner'' OPTIONAL, ''enabled'' OPTIONAL) : '''Timer'''&lt;br /&gt;
&lt;br /&gt;
'''function''' createTimer(''interval'', ''callback'', ''...'' OPTIONAL) : '''Timer'''&lt;br /&gt;
&lt;br /&gt;
Creates a [[Lua:Class:Timer|Timer]] object that fires repeatedly or once at specified intervals.&lt;br /&gt;
&lt;br /&gt;
* '''Returns:''' A [[Lua:Class:Timer|Timer]] UserData object&lt;br /&gt;
* '''Modes:''' Two distinct calling modes with different behaviors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Two Calling Modes ==&lt;br /&gt;
&lt;br /&gt;
'''Mode 1: Persistent Timer''' - Creates a recurring timer that continues until destroyed or disabled&lt;br /&gt;
 createTimer(owner, enabled)&lt;br /&gt;
&lt;br /&gt;
'''Mode 2: One-Shot Timer''' - Creates a timer that fires once and auto-destroys&lt;br /&gt;
 createTimer(interval, callback, ...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Function Parameters ==&lt;br /&gt;
&lt;br /&gt;
=== Mode 1: Persistent Timer ===&lt;br /&gt;
&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellpadding=&amp;quot;5%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Parameter&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Type&lt;br /&gt;
!style=&amp;quot;width: 80%;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|owner&lt;br /&gt;
|Component or nil&lt;br /&gt;
|'''Optional.''' Parent component that owns this timer. When the owner is destroyed, the timer is destroyed too. Pass '''nil''' or omit for standalone timer. Default: '''nil'''&lt;br /&gt;
|-&lt;br /&gt;
|enabled&lt;br /&gt;
|boolean&lt;br /&gt;
|'''Optional.''' Whether the timer starts active immediately. Default: '''true'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mode 2: One-Shot Timer ===&lt;br /&gt;
&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellpadding=&amp;quot;5%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Parameter&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Type&lt;br /&gt;
!style=&amp;quot;width: 80%;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|interval&lt;br /&gt;
|integer&lt;br /&gt;
|Timer delay in '''milliseconds''' before callback fires once&lt;br /&gt;
|-&lt;br /&gt;
|callback&lt;br /&gt;
|function&lt;br /&gt;
|Function to execute when the timer fires. Receives any additional varargs as parameters&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|'''varargs'''&lt;br /&gt;
|'''Optional.''' Additional arguments to pass to the callback function&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Persistent Timer Examples ===&lt;br /&gt;
&lt;br /&gt;
'''Basic recurring timer (runs every second):'''&lt;br /&gt;
 local timer = createTimer()&lt;br /&gt;
 timer.Interval = 1000  -- 1 second&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   print(&amp;quot;Tick: &amp;quot; .. os.date(&amp;quot;%H:%M:%S&amp;quot;))&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
'''Timer with owner (destroyed when form closes):'''&lt;br /&gt;
 local form = createForm()&lt;br /&gt;
 local timer = createTimer(form)&lt;br /&gt;
 timer.Interval = 500&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   form.Caption = &amp;quot;Time: &amp;quot; .. os.date(&amp;quot;%H:%M:%S&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
'''Timer owned by main form (auto-cleanup when CE closes):'''&lt;br /&gt;
 local timer = createTimer(getMainForm())&lt;br /&gt;
 timer.Interval = 1000&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   print(&amp;quot;Running until CE closes&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
'''Create disabled timer and enable later:'''&lt;br /&gt;
 local timer = createTimer(nil, false)&lt;br /&gt;
 timer.Interval = 2000&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   print(&amp;quot;2 seconds passed&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
 -- Enable when needed&lt;br /&gt;
 timer.Enabled = true&lt;br /&gt;
&lt;br /&gt;
'''Manual cleanup when done:'''&lt;br /&gt;
 local timer = createTimer()&lt;br /&gt;
 timer.Interval = 100&lt;br /&gt;
 local count = 0&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   count = count + 1&lt;br /&gt;
   print(&amp;quot;Count: &amp;quot; .. count)&lt;br /&gt;
   if count &amp;gt;= 10 then&lt;br /&gt;
     timer.Enabled = false&lt;br /&gt;
     timer.destroy()&lt;br /&gt;
     print(&amp;quot;Timer stopped and destroyed&amp;quot;)&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
'''Toggle timer on/off:'''&lt;br /&gt;
 local timer = createTimer()&lt;br /&gt;
 timer.Interval = 1000&lt;br /&gt;
 timer.Enabled = false&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   print(&amp;quot;Active!&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- Start&lt;br /&gt;
 timer.Enabled = true&lt;br /&gt;
 -- Stop&lt;br /&gt;
 timer.Enabled = false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== One-Shot Timer Examples ===&lt;br /&gt;
&lt;br /&gt;
'''Simple delay (auto-destroys after firing):'''&lt;br /&gt;
 createTimer(2000, function()&lt;br /&gt;
   print(&amp;quot;Executed after 2 seconds&amp;quot;)&lt;br /&gt;
 end)&lt;br /&gt;
&lt;br /&gt;
'''One-shot timer with parameters:'''&lt;br /&gt;
 local name = &amp;quot;Player&amp;quot;&lt;br /&gt;
 local health = 100&lt;br /&gt;
 &lt;br /&gt;
 createTimer(1500, function(playerName, hp)&lt;br /&gt;
   print(playerName .. &amp;quot; health: &amp;quot; .. hp)&lt;br /&gt;
 end, name, health)&lt;br /&gt;
&lt;br /&gt;
'''Delayed execution in sequence:'''&lt;br /&gt;
 print(&amp;quot;Starting...&amp;quot;)&lt;br /&gt;
 createTimer(1000, function()&lt;br /&gt;
   print(&amp;quot;Step 1: After 1 second&amp;quot;)&lt;br /&gt;
 end)&lt;br /&gt;
 createTimer(2000, function()&lt;br /&gt;
   print(&amp;quot;Step 2: After 2 seconds&amp;quot;)&lt;br /&gt;
 end)&lt;br /&gt;
 createTimer(3000, function()&lt;br /&gt;
   print(&amp;quot;Step 3: After 3 seconds&amp;quot;)&lt;br /&gt;
 end)&lt;br /&gt;
&lt;br /&gt;
'''One-shot timer with closure:'''&lt;br /&gt;
 local function showMessage(msg)&lt;br /&gt;
   createTimer(1000, function()&lt;br /&gt;
     print(&amp;quot;Delayed message: &amp;quot; .. msg)&lt;br /&gt;
   end)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 showMessage(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''Delayed form update:'''&lt;br /&gt;
 local form = createForm()&lt;br /&gt;
 form.Caption = &amp;quot;Loading...&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 createTimer(2000, function()&lt;br /&gt;
   form.Caption = &amp;quot;Ready!&amp;quot;&lt;br /&gt;
 end)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Timer Patterns ===&lt;br /&gt;
&lt;br /&gt;
'''Countdown timer:'''&lt;br /&gt;
 local countdown = 10&lt;br /&gt;
 local timer = createTimer()&lt;br /&gt;
 timer.Interval = 1000&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   print(&amp;quot;Countdown: &amp;quot; .. countdown)&lt;br /&gt;
   countdown = countdown - 1&lt;br /&gt;
   if countdown &amp;lt; 0 then&lt;br /&gt;
     timer.Enabled = false&lt;br /&gt;
     timer.destroy()&lt;br /&gt;
     print(&amp;quot;Countdown complete!&amp;quot;)&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
'''Periodic memory check:'''&lt;br /&gt;
 local timer = createTimer()&lt;br /&gt;
 timer.Interval = 500&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   local addr = getAddress(&amp;quot;player.health&amp;quot;)&lt;br /&gt;
   if addr then&lt;br /&gt;
     local health = readInteger(addr)&lt;br /&gt;
     if health &amp;lt; 50 then&lt;br /&gt;
       print(&amp;quot;Warning: Low health!&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
'''Auto-refresh display:'''&lt;br /&gt;
 local form = createForm()&lt;br /&gt;
 local label = createLabel(form)&lt;br /&gt;
 label.Caption = &amp;quot;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 local timer = createTimer(form)&lt;br /&gt;
 timer.Interval = 100&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   local addr = getAddress(&amp;quot;game.score&amp;quot;)&lt;br /&gt;
   if addr then&lt;br /&gt;
     label.Caption = &amp;quot;Score: &amp;quot; .. readInteger(addr)&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
'''Rate-limited action:'''&lt;br /&gt;
 local canExecute = true&lt;br /&gt;
 local timer = createTimer(nil, false)&lt;br /&gt;
 timer.Interval = 1000&lt;br /&gt;
 timer.OnTimer = function()&lt;br /&gt;
   canExecute = true&lt;br /&gt;
   timer.Enabled = false&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 function performAction()&lt;br /&gt;
   if canExecute then&lt;br /&gt;
     print(&amp;quot;Action executed!&amp;quot;)&lt;br /&gt;
     canExecute = false&lt;br /&gt;
     timer.Enabled = true&lt;br /&gt;
   else&lt;br /&gt;
     print(&amp;quot;Please wait...&amp;quot;)&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Persistent vs One-Shot Comparison ==&lt;br /&gt;
&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;5%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot; align=&amp;quot;left&amp;quot;|Feature&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Persistent Timer&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|One-Shot Timer&lt;br /&gt;
|-&lt;br /&gt;
|'''Creation'''&lt;br /&gt;
|createTimer() or createTimer(owner, enabled)&lt;br /&gt;
|createTimer(interval, callback, ...)&lt;br /&gt;
|-&lt;br /&gt;
|'''Behavior'''&lt;br /&gt;
|Fires repeatedly until disabled&lt;br /&gt;
|Fires once and auto-destroys&lt;br /&gt;
|-&lt;br /&gt;
|'''Cleanup'''&lt;br /&gt;
|Must call destroy() manually&lt;br /&gt;
|Destroys itself automatically&lt;br /&gt;
|-&lt;br /&gt;
|'''Control'''&lt;br /&gt;
|Can enable/disable with .Enabled&lt;br /&gt;
|Cannot control after creation&lt;br /&gt;
|-&lt;br /&gt;
|'''Callback Setup'''&lt;br /&gt;
|Set .OnTimer property after creation&lt;br /&gt;
|Callback passed during creation&lt;br /&gt;
|-&lt;br /&gt;
|'''Typical Use'''&lt;br /&gt;
|Monitoring, periodic updates, UI refresh&lt;br /&gt;
|Delays, deferred execution, timeouts&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* '''Interval''' is in milliseconds (1000 = 1 second)&lt;br /&gt;
* Timers inherit from [[Lua:Class:Component|Component]] class&lt;br /&gt;
* '''One-shot timers''' automatically free themselves - do not call destroy()&lt;br /&gt;
* '''Persistent timers''' must be destroyed manually or by owner&lt;br /&gt;
* Use '''getMainForm()''' as owner to auto-destroy timer when CE closes&lt;br /&gt;
* Timer callbacks execute in the main CE thread&lt;br /&gt;
* Setting '''Enabled = false''' pauses the timer without destroying it&lt;br /&gt;
* Timer accuracy depends on system load (~15ms resolution on Windows)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Common Mistakes ==&lt;br /&gt;
&lt;br /&gt;
'''Don't store one-shot timer reference:'''&lt;br /&gt;
 -- WRONG: One-shot timer will self-destruct&lt;br /&gt;
 local t = createTimer(1000, function() print(&amp;quot;Hi&amp;quot;) end)&lt;br /&gt;
 -- t becomes invalid after firing&lt;br /&gt;
 &lt;br /&gt;
 -- RIGHT: Just create and forget&lt;br /&gt;
 createTimer(1000, function() print(&amp;quot;Hi&amp;quot;) end)&lt;br /&gt;
&lt;br /&gt;
'''Don't forget to destroy persistent timers:'''&lt;br /&gt;
 -- WRONG: Memory leak if timer never destroyed&lt;br /&gt;
 function startMonitoring()&lt;br /&gt;
   local t = createTimer()&lt;br /&gt;
   t.Interval = 1000&lt;br /&gt;
   t.OnTimer = function() print(&amp;quot;Check&amp;quot;) end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- RIGHT: Store reference and destroy when done&lt;br /&gt;
 local monitorTimer = nil&lt;br /&gt;
 function startMonitoring()&lt;br /&gt;
   monitorTimer = createTimer()&lt;br /&gt;
   monitorTimer.Interval = 1000&lt;br /&gt;
   monitorTimer.OnTimer = function() print(&amp;quot;Check&amp;quot;) end&lt;br /&gt;
 end&lt;br /&gt;
 function stopMonitoring()&lt;br /&gt;
   if monitorTimer then&lt;br /&gt;
     monitorTimer.destroy()&lt;br /&gt;
     monitorTimer = nil&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaSeeAlso}}&lt;br /&gt;
&lt;br /&gt;
=== Related Functions ===&lt;br /&gt;
* [[Lua:sleep|sleep]] - Blocking delay alternative&lt;br /&gt;
* [[Lua:createThread|createThread]] - Non-blocking threading&lt;br /&gt;
&lt;br /&gt;
=== Related Classes ===&lt;br /&gt;
* [[Lua:Class:Timer|Timer]] - Timer class documentation&lt;br /&gt;
* [[Lua:Class:Component|Component]] - Base class for Timer&lt;/div&gt;</summary>
		<author><name>Mr millchick</name></author>
		
	</entry>
</feed>