47 lines
1.1 KiB
Nim
47 lines
1.1 KiB
Nim
# https://nim-lang.org/docs/channels.html
|
|
# nim c --threads:on --gc:arc -r thread1.nim
|
|
|
|
import gintro/[gtk, glib, gobject, gio]
|
|
from os import sleep
|
|
|
|
var channel: Channel[int]
|
|
var workThread: system.Thread[void]
|
|
|
|
proc workProc =
|
|
var countdown {.global.} = 25
|
|
while countdown > 0:
|
|
sleep(1000)
|
|
dec(countdown)
|
|
channel.send(countdown)
|
|
|
|
proc updateGUI(b: Button): bool =
|
|
let msg = channel.tryRecv()
|
|
if msg.dataAvailable:
|
|
b.label = $msg.msg
|
|
if msg.msg == 0:
|
|
workThread.joinThread
|
|
channel.close
|
|
return SOURCE_REMOVE
|
|
return SOURCE_CONTINUE
|
|
|
|
proc buttonClicked (b: Button) =
|
|
b.label = utf8Strreverse(b.label, -1)
|
|
|
|
proc activate (app: Application) =
|
|
let window = newApplicationWindow(app)
|
|
window.title = "Countdown"
|
|
window.defaultSize = (250, 50)
|
|
let button = newButton("Click Me")
|
|
window.add(button)
|
|
button.connect("clicked", buttonClicked)
|
|
window.showAll
|
|
channel.open
|
|
createThread(workThread, workProc)
|
|
discard timeoutAdd(1000 div 60, updateGUI, button)
|
|
|
|
proc main =
|
|
let app = newApplication("org.gtk.example")
|
|
connect(app, "activate", activate)
|
|
discard app.run
|
|
|
|
main()
|