Events: Difference between revisions

10,147 bytes added ,  5 months ago
added Easylang
(Events en FreeBASIC)
(added Easylang)
 
(8 intermediate revisions by 7 users not shown)
Line 28:
 
The event interface:
<langsyntaxhighlight lang="ada">protected type Event is
procedure Signal;
procedure Reset;
Line 34:
private
Fired : Boolean := False;
end Event;</langsyntaxhighlight>
The event implementation:
<langsyntaxhighlight lang="ada">protected body Event is
procedure Signal is
begin
Line 49:
null;
end Wait;
end Event;</langsyntaxhighlight>
With the event defined above:
<langsyntaxhighlight lang="ada">with Ada.Text_IO; use Ada.Text_IO;
 
procedure Test_Events is
Line 68:
Put_Line ("Signal X");
X.Signal;
end Test_Events;</langsyntaxhighlight>
Sample output:
<pre>
Line 77:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">SetTimer, internal, 1000
Return
 
Line 87:
F2:: ; external event: fire on F2 key press
TrayTip, external, f2 key pressed
Return</langsyntaxhighlight>
 
 
=={{header|BASIC256}}==
{{trans|Gambas}}
<syntaxhighlight lang="basic256">
subroutine Timer1_Timer()
print hour; ":"; minute; ":"; second
end subroutine
</syntaxhighlight>
{{out}}
<pre>
Igual que la entrada de Gambas.
</pre>
 
 
=={{header|BBC BASIC}}==
Line 93 ⟶ 107:
===API===
This uses a Windows event object:
<langsyntaxhighlight lang="bbcbasic"> INSTALL @lib$+"TIMERLIB"
WAIT_TIMEOUT = 258
Line 109 ⟶ 123:
DEF PROCelapsed
SYS "SetEvent", hEvent%
ENDPROC</langsyntaxhighlight>
===Native===
This uses a simple variable as a semaphore:
<langsyntaxhighlight lang="bbcbasic"> INSTALL @lib$+"TIMERLIB"
Event% = FALSE
Line 127 ⟶ 141:
DEF PROCelapsed
Event% = TRUE
ENDPROC</langsyntaxhighlight>
 
=={{header|C}}==
Using pipe to communicate to <code>fork</code>ed child. Since child will be blocking trying to read the other end of the pipe, this can be used for synchronization.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <unistd.h>
 
Line 149 ⟶ 163:
}
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
using System.Timers;
 
Line 171 ⟶ 185:
((Timer)sender).Stop();
}
}</langsyntaxhighlight>
Sample output:
<pre>10-11-2010 18:35:11
Line 178 ⟶ 192:
=={{header|Clojure}}==
{{trans|Go}}
<langsyntaxhighlight lang="lisp">(ns async-example.core
(:require [clojure.core.async :refer [>! <! >!! <!! go chan]])
(:require [clj-time.core :as time])
Line 215 ⟶ 229:
; Invoke -main function
(-main)
</syntaxhighlight>
</lang>
{{Output}}
<pre>
Line 226 ⟶ 240:
 
=={{header|Delphi}}==
<langsyntaxhighlight Delphilang="delphi">program Events;
 
{$APPTYPE CONSOLE}
Line 279 ⟶ 293:
end;
Readln;
end.</langsyntaxhighlight>
Sample output:
<pre>
Line 287 ⟶ 301:
 
=={{header|E}}==
<langsyntaxhighlight lang="e">def makeEvent() {
def [var fired, var firer] := Ref.promise()
Line 310 ⟶ 324:
return event
}</langsyntaxhighlight>
The event object has this behavior: the return value of <code>.wait()</code> will be resolved after the time of the earliest <code>.signal()</code> for which there is no intervening <code>.reset()</code>.
<langsyntaxhighlight lang="e">def e := makeEvent()
 
{
Line 327 ⟶ 341:
})
println("[1] Waiting 1 second...")
}</langsyntaxhighlight>
 
=={{header|EasyLang}}==
 
[https://easylang.dev/show/#cod=y89TKMnMTS3iUlBQyM0vS1UoSsxLyc9NU9BSMDQwQOWB1CRnFiXnpCoYgdhgjQqGXHpc+XlAzaXFqfEp+eV5cKMgQhVQuhJFux4XRLcBFwA= Run it]
 
<syntaxhighlight>
on timer
move randomf * 100 randomf * 100
circle 2
timer 1
.
on mouse_down
move mouse_x mouse_y
circle 2
.
timer 0
</syntaxhighlight>
 
=={{header|Elixir}}==
{{trans|Erlang}}
<langsyntaxhighlight lang="elixir">defmodule Events do
def log(msg) do
time = Time.utc_now |> to_string |> String.slice(0..7)
Line 358 ⟶ 389:
end
 
Events.main</langsyntaxhighlight>
 
{{out}}
Line 371 ⟶ 402:
=={{header|Erlang}}==
Events can be implemented by using the selective receive expression and erlang's built in message passing. Here task waits for the message 'go' before it will continue.
<langsyntaxhighlight lang="erlang">
-module(events).
-compile(export_all).
Line 394 ⟶ 425:
P ! go,
timer:sleep(100).
</syntaxhighlight>
</lang>
'''Output:'''
<langsyntaxhighlight lang="erlang">
66> events:main().
0: 0:57 => Program start
Line 404 ⟶ 435:
0: 0:58 => Task resumed
ok
</syntaxhighlight>
</lang>
 
=={{header|F_Sharp|F#}}==
{{trans|C#}}
<langsyntaxhighlight lang="fsharp">open System
open System.Timers
 
Line 422 ⟶ 453:
timer.Start()
ignore <| Console.ReadLine()
0</langsyntaxhighlight>
 
 
=={{header|FreeBASIC}}==
{{trans|Gambas}}
<langsyntaxhighlight lang="freebasic">
Sub Timer1_Timer()
Print Time
End Sub
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 437 ⟶ 468:
</pre>
 
 
=={{header|FutureBasic}}==
Event timer fires every tenth of a second
<syntaxhighlight lang="futurebasic">
timerbegin, 0.1, YES
cls : printf @"%@", time(@"h:mm:ss a zzz")
timerend
 
HandleEvents
</syntaxhighlight>
{{output}}
<pre>
4:44:36 PM EDT
</pre>
 
=={{header|Gambas}}==
<langsyntaxhighlight lang="gambas">Public Sub Timer1_Timer()
 
Print Str(Time(Now))
 
End</langsyntaxhighlight>
Output:
<pre>
Line 458 ⟶ 503:
=={{header|Go}}==
A Go channel can represent an manual-reset event, as described by the task. The two states of signaled and reset correspond to the presence or absence of a value on the channel. The program signals by sending a value on the channel. The event is reset when the waiting task explicitly executes the channel receive operation, <-event.
<langsyntaxhighlight lang="go">package main
 
import (
Line 480 ⟶ 525:
event <- 0
time.Sleep(100 * time.Millisecond)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 491 ⟶ 536:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Control.Concurrent (threadDelay, forkIO)
import Control.Concurrent.SampleVar
 
Line 501 ⟶ 546:
signalEvent (Event sv) = writeSampleVar sv ()
resetEvent (Event sv) = emptySampleVar sv
waitEvent (Event sv) = readSampleVar sv</langsyntaxhighlight>
<langsyntaxhighlight lang="haskell">main = do e <- newEvent
forkIO (waitTask e)
putStrLn "[1] Waiting 1 second..."
Line 512 ⟶ 557:
waitTask e = do putStrLn "[2] Waiting for event..."
waitEvent e
putStrLn "[2] Received event."</langsyntaxhighlight>
Note: Because there is no serialization of the text output, there is a chance that it will appear interleaved.
 
Line 519 ⟶ 564:
The following only works in Unicon. The example illustrates the multiple tasks can
receive the same event:
<langsyntaxhighlight lang="unicon">record Event(cond, value)
 
procedure main()
Line 538 ⟶ 583:
signal(event.cond,0)
every wait(t1|t2)
end</langsyntaxhighlight>
 
Sample run:
Line 553 ⟶ 598:
=={{header|JavaScript}}==
An example using the [[wp:Yahoo!_UI_Library|YUI]] library:
<langsyntaxhighlight lang="javascript">YUI().use('event-custom', function(Y) {
// add a custom event:
Y.on('my:event', function () {
Line 562 ⟶ 607:
Y.fire('my:event');
}, 1000);
});</langsyntaxhighlight>
An example simulating [[wp:Document_Object_Model|DOM]] events:
<langsyntaxhighlight lang="javascript">YUI().use('node-event-simulate', function(Y) {
// add a click event handler to a DOM node with id "button":
Y.one("#button").on("click", function (e) {
Line 573 ⟶ 618:
Y.one("#button").simulate("click");
}, 1000);
});</langsyntaxhighlight>
 
=={{header|Julia}}==
Line 580 ⟶ 625:
between two child threads.
 
<langsyntaxhighlight lang="julia">
function dolongcomputation(cond)
det(rand(4000, 4000))
Line 601 ⟶ 646:
sleep(5)
println("Done sleeping.")
</syntaxhighlight>
</lang>
{{output}}<pre>
Starting task, sleeping...
Line 614 ⟶ 659:
Paste in the REPL:
 
<langsyntaxhighlight lang="lisp">
(defun log (msg)
(let ((`#(,h ,m ,s) (erlang:time)))
Line 634 ⟶ 679:
(! pid 'go)
(timer:sleep 100))))
</syntaxhighlight>
</lang>
 
Usage:
Line 653 ⟶ 698:
 
To catch an event, a corresponding event handler - a function with a predefined name - has to be definined in the code. Examples for such event handlers are:
<langsyntaxhighlight lang="lingo">-- the current window was closed
on closeWindow
...
Line 661 ⟶ 706:
on mouseDown
...
end</langsyntaxhighlight>
Also "Sprites" (visual elements) receive events by setting up such event handlers in scripts attached to them. Both predefined and custom events can be sent programmatically to sprites, e.g. using:
<langsyntaxhighlight lang="lingo">-- send event #mouseDown programmatically to sprite 1
sendSprite(1, #mouseDown)
 
Line 670 ⟶ 715:
 
-- send custom event #fooBar to all existing sprites
sendAllSprites(#fooBar)</langsyntaxhighlight>
 
Using a binary plugin ("Xtra"), in Windows also lower level window messages can be both sent and received:
{{libheader|Msg Xtra}}
<langsyntaxhighlight lang="lingo">mx = xtra("Msg").new()
 
-- send message WM_LBUTTONDOWN to a specific window identified by HWND hwnd
Line 688 ⟶ 733:
WM_COPYDATA = 74
WM_MOUSEWHEEL = 522
mx.msg_listen([WM_COPYDATA, WM_MOUSEWHEEL], VOID, #msgReceived)</langsyntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Mathematica supports events from timers (via Pause[]), task schedule descriptors. This will print a message after 4 seconds, then terminate the program.
<langsyntaxhighlight Mathematicalang="mathematica">Print["Will exit in 4 seconds"]; Pause[4]; Quit[]
->Will exit in 4 seconds</langsyntaxhighlight>
 
=={{header|Nim}}==
{{trans|C}}
<langsyntaxhighlight lang="nim">import posix
 
var p: array[2, cint]
Line 710 ⟶ 755:
discard close p[1]
discard p[0].read(addr p[1], 1)
echo "received signal from pipe"</langsyntaxhighlight>
 
===Stdlib Semaphore===
This version using locks module for signaling the condition.
 
<langsyntaxhighlight lang="nim">import locks
from os import sleep
import times
Line 744 ⟶ 789:
deinitLock lock
 
main()</langsyntaxhighlight>
 
Compile and run: <pre>nim c -r --threads:on events_cond.nim</pre>
Line 757 ⟶ 802:
An event is often implemented with a control channel. A task is waiting for an object on the channel. When the event occurs, another task sends an object on this channel.
 
<langsyntaxhighlight Oforthlang="oforth">: anEvent
| ch |
Channel new ->ch
#[ ch receive "Ok, event is signaled !" println ] &
System sleep(1000)
ch send($myEvent) ;</langsyntaxhighlight>
 
An emitter is a general implementation for handling events : an emitter waits for events emitted and launches listeners that are waiting for those events.
<langsyntaxhighlight Oforthlang="oforth">import: emitter
 
: anEvent2
Line 775 ⟶ 820:
$myEvent e emit
]
e close ;</langsyntaxhighlight>
 
=={{header|Oz}}==
{{trans|Haskell}}
Events can be implemented as mutable references to dataflow variables:
<langsyntaxhighlight lang="oz">declare
fun {NewEvent}
{NewCell _}
Line 808 ⟶ 853:
{Delay 1000}
{System.showInfo "[1] Signaling event."}
{SignalEvent E}</langsyntaxhighlight>
However, this code is quite unidiomatic. If we need to wait for an event just once (like in this example), we can simply use a dataflow variable, i.e. an event that cannot be reset:
<langsyntaxhighlight lang="oz">declare
E
in
Line 822 ⟶ 867:
{Delay 1000}
{System.showInfo "[1] Signaling event."}
E = unit</langsyntaxhighlight>
If we want to synchronize two threads repeatedly and exchange data, it is natural to use ports and streams. Streams are just lists with an unbound tail. A port is basically a pointer to the tail of a list, i.e. it keeps track of where the next event can be written to:
<langsyntaxhighlight lang="oz">declare
MyPort
in
Line 843 ⟶ 888:
{System.showInfo "[1] Signaling event."}
{Port.send MyPort unit}
end</langsyntaxhighlight>
It is important to limit the scope of a stream as much as possible to ensure that the already read part of the stream is garbage-collected.
 
Line 849 ⟶ 894:
This is an example of using the [http://search.cpan.org/perldoc?AnyEvent AnyEvent] module.
The result is this: it prints "Hello world!" after one second, then after another second prints "Hi!" four times every quarter of a second and then immediately prints "Bye!" and quits:
<langsyntaxhighlight Perllang="perl">use AnyEvent;
 
# a new condition with a callback:
Line 879 ⟶ 924:
 
# wait for the $quit condition to be ready:
$quit->recv();</langsyntaxhighlight>
This is the same using AnyEvent [http://search.cpan.org/perldoc?AE simplified API]:
<langsyntaxhighlight Perllang="perl">use AnyEvent;
 
my $quit = AE::cv sub { warn "Bye!\n" };
Line 895 ⟶ 940:
};
 
$quit->recv;</langsyntaxhighlight>
 
=={{header|Phix}}==
Line 901 ⟶ 946:
in main() acts as signalling an event, and the one in echo() from whichever goes first acts to signal
that the other can/should resume.
<!--<syntaxhighlight lang="phix">(notonline)-->
<lang Phix>constant lock = init_cs()
<span style="color: #008080;">constant</span> <span style="color: #000000;">lock</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">init_cs</span><span style="color: #0000FF;">()</span>
include timedate.e
<span style="color: #008080;">include</span> <span style="color: #000000;">timedate</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
 
procedure showtime()
<span style="color: #008080;">procedure</span> <span style="color: #000000;">showtime</span><span style="color: #0000FF;">()</span>
puts(1,format_timedate(date()," h:m:s\n"))
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">format_timedate</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">date</span><span style="color: #0000FF;">(),</span><span style="color: #008000;">" h:m:s\n"</span><span style="color: #0000FF;">))</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
procedure echo(string s)
<span style="color: #008080;">procedure</span> <span style="color: #000000;">echo</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
sleep(rnd()/10) -- see note
<span style="color: #7060A8;">sleep</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">rnd</span><span style="color: #0000FF;">()/</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- see note</span>
enter_cs(lock)
<span style="color: #7060A8;">enter_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lock</span><span style="color: #0000FF;">)</span>
puts(1,s)
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
sleep(1)
<span style="color: #7060A8;">sleep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
showtime()
<span style="color: #000000;">showtime</span><span style="color: #0000FF;">()</span>
leave_cs(lock)
<span style="color: #7060A8;">leave_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lock</span><span style="color: #0000FF;">)</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
procedure main()
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
enter_cs(lock)
<span style="color: #7060A8;">enter_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lock</span><span style="color: #0000FF;">)</span>
sequence threads = {create_thread(routine_id("echo"),{"job1"}),
<span style="color: #004080;">sequence</span> <span style="color: #000000;">threads</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">create_thread</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">routine_id</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"echo"</span><span style="color: #0000FF;">),{</span><span style="color: #008000;">"job1"</span><span style="color: #0000FF;">}),</span>
create_thread(routine_id("echo"),{"job2"})}
<span style="color: #000000;">create_thread</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">routine_id</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"echo"</span><span style="color: #0000FF;">),{</span><span style="color: #008000;">"job2"</span><span style="color: #0000FF;">})}</span>
puts(1,"main")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"main"</span><span style="color: #0000FF;">)</span>
showtime()
<span style="color: #000000;">showtime</span><span style="color: #0000FF;">()</span>
sleep(1)
<span style="color: #7060A8;">sleep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
puts(1,"free")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"free"</span><span style="color: #0000FF;">)</span>
showtime()
<span style="color: #000000;">showtime</span><span style="color: #0000FF;">()</span>
leave_cs(lock)
<span style="color: #7060A8;">leave_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lock</span><span style="color: #0000FF;">)</span>
wait_thread(threads)
<span style="color: #000000;">wait_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">threads</span><span style="color: #0000FF;">)</span>
puts(1,"done\n")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"done\n"</span><span style="color: #0000FF;">)</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
main()</lang>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
{{out}}
Typically the first thread to attempt enter_cs() is released first, but there is
Line 943 ⟶ 990:
</pre>
External events such as timers and user input are handled in pGUI, eg
<!--<syntaxhighlight lang="phix">-->
<lang Phix>function timer_cb(Ihandle /*ih*/)
<span style="color: #008080;">function</span> <span style="color: #000000;">timer_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
IupUpdate(canvas)
<span style="color: #7060A8;">IupUpdate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">)</span>
return IUP_IGNORE
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_IGNORE</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
Ihandle timer = IupTimer(Icallback("timer_cb"), 1000)
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">timer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupTimer</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"timer_cb"</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">1000</span><span style="color: #0000FF;">)</span>
 
function key_cb(Ihandle /*ih*/, atom c)
<span style="color: #008080;">function</span> <span style="color: #000000;">key_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">)</span>
if c=K_ESC then return IUP_CLOSE end if
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #004600;">K_ESC</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">IUP_CLOSE</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if c=K_F5 then
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #004600;">K_F5</span> <span style="color: #008080;">then</span>
iteration = 0
<span style="color: #000000;">iteration</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
IupSetInt(timer,"RUN",1) -- (restart timer)
<span style="color: #7060A8;">IupSetInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"RUN"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (restart timer)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return IUP_CONTINUE
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_CONTINUE</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
IupSetCallback(dlg, "K_ANY", Icallback("key_cb"))</lang>
<span style="color: #7060A8;">IupSetCallback</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"K_ANY"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"key_cb"</span><span style="color: #0000FF;">))</span>
<!--</syntaxhighlight>-->
 
=={{header|PicoLisp}}==
Line 969 ⟶ 1,018:
This will print a message after one second, then terminate the program after
another four seconds:
<langsyntaxhighlight PicoLisplang="picolisp">(alarm 1
(prinl "Exit in 4 seconds")
(alarm 4 (bye)) )</langsyntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
$timer = New-Object -TypeName System.Timers.Timer -Property @{Enabled=$true; Interval=1000; AutoReset=$true}
 
Line 991 ⟶ 1,040:
$global:counter = 0
& $job.Module {$global:counter}
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 1,003 ⟶ 1,052:
 
=={{header|PureBasic}}==
<langsyntaxhighlight Purebasiclang="purebasic">OpenWindow (0, 10, 10, 150, 40, "Event Demo")
ButtonGadget (1, 10, 10, 35, 20, "Quit")
 
Line 1,014 ⟶ 1,063:
EndIf
ForEver</langsyntaxhighlight>
 
=={{header|Python}}==
 
<syntaxhighlight lang="python">
<lang Python>
import threading
import time
Line 1,039 ⟶ 1,088:
print("Main: Done")
t.join()
</syntaxhighlight>
</lang>
 
=={{header|Racket}}==
Line 1,050 ⟶ 1,099:
the task (since it's a useless value):
 
<langsyntaxhighlight lang="racket">
#lang racket
 
Line 1,059 ⟶ 1,108:
 
(void (sync task)) ; wait for the task to be done before exiting
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{trans|Go}}
<syntaxhighlight lang="raku" perl6line>note now, " program start";
my $event = Channel.new;
 
Line 1,077 ⟶ 1,126:
note now, " program signaling event";
$event.send(0);
await $todo;</langsyntaxhighlight>
{{out}}
<pre>Instant:1403880984.089974 program start
Line 1,090 ⟶ 1,139:
Although REXX can be event driven, most events would probably have to be actively checked to see if the event occurs.
<br>Here is a &nbsp; ''time-driven'' &nbsp; example of events happening, based on specific timer ticks.
<langsyntaxhighlight lang="rexx">/*REXX program demonstrates a method of handling events (this is a time─driven pgm).*/
signal on halt /*allow the user to HALT (Break) the programpgm.*/
parse arg timeEvent /*allow the "event" to be specified. */
if timeEvent='' then timeEvent=5 5 /*Not specified? Then use the default.*/
 
event?: do forever /*determine if an event has occurred. */
theEvent= right(time(), 1) /*maybe it's an event, ─or─ maybe not.*/
if pos(theEvent, timeEvent)\==>0 then signal happening
end /*forever*/
 
say 'Control should never get here!' /*This is a logic can─never─happen ! */
halt: say '════════════ program halted.'; exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
happening: say 'an event occurred at' time()", the event is:" theEvent
do while theEvent==right(time(), 1) /*spin until a tic (a second) changes. */
nop /*replace NOP with the "process" code.*/
end /*while*/ /*NOP is a special REXX statement. , does nothing*/
signal event? signal event? /*see if another event has happened. */</langsyntaxhighlight>
'''{{out|output''' |text=&nbsp; when using the input of: &nbsp; &nbsp; <tt> 1 &nbsp; 3 &nbsp; 5 &nbsp; 0 &nbsp; 7 &nbsp; 9 </tt>}}
<pre>
an event occurred at 16:13:29, the event is: 9
Line 1,133 ⟶ 1,182:
Rust ensures memory safety at compile-time without needing a garbage collector or runtime. There are several concurrency primitives in it's standard library.
 
<syntaxhighlight lang="rust">
<lang Rust>
use std::{sync::mpsc, thread, time::Duration};
 
Line 1,151 ⟶ 1,200:
Ok(())
}
</syntaxhighlight>
</lang>
 
=={{header|Tcl}}==
Tcl has been event-driven since 7.5, but only supported channel and timer events (plus variable traces, which can be used to create event-like entitites). With the addition of coroutines, it becomes much simpler to create general events:
{{works with|Tcl|8.6}}
<langsyntaxhighlight lang="tcl"># Simple task framework built from coroutines
proc pause ms {
after $ms [info coroutine];yield
Line 1,209 ⟶ 1,258:
X signal
}
waitForTasksToFinish</langsyntaxhighlight>
Output:
<pre>waiting for event
Line 1,215 ⟶ 1,264:
received event</pre>
Of course, the classic way of writing this is much shorter, but intermingles the tasks:
<langsyntaxhighlight lang="tcl">after 1000 set X signalled
puts "waiting for event"
vwait X
puts "received event"</langsyntaxhighlight>
 
=={{header|Wren}}==
Line 1,224 ⟶ 1,273:
 
The tasks to be executed are added to a list by the Scheduler class. The Timer.sleep method suspends the current fiber and signals the scheduler (by calling a private method) to execute the tasks one by one in their own fibers - in Wren only one fiber can execute at a time. The task results are then available to the main fiber on its resumption after Timer.sleep has completed.
<langsyntaxhighlight ecmascriptlang="wren">import "scheduler" for Scheduler
import "timer" for Timer
 
Line 1,240 ⟶ 1,289:
System.print(a) // still 3
Timer.sleep(3000) // wait 3 seconds
System.print(a) // now 3 * 3 + 1 = 10</langsyntaxhighlight>
 
{{out}}
Line 1,247 ⟶ 1,296:
10
</pre>
 
=={{header|Yabasic}}==
{{trans|Gambas}}
<syntaxhighlight lang="yabasic">
sub Timer1_Timer()
print Time$
end sub
</syntaxhighlight>
 
 
=={{header|zkl}}==
zkl provides an Atomics library for things like this. Events are async, waiting for an event doesn't poll.
<langsyntaxhighlight lang="zkl">var event=Atomic.Bool(); // False
// create thread waiting for event
fcn(event){event.wait(); println(vm," ping!")}.launch(event);
Atomic.sleep(1);
event.set();
println("done")</langsyntaxhighlight>
{{out}}
<pre>
1,981

edits