Thanks, it’s good to hear from more people writing this kind of application. I think there’s a huge potential to be explored in Julia writing guis with libraries such a Gtk, which seems to be the most usable right now.
I got my application to do what I wanted, although I’m not entirely sure how it relates to you answer. What I noticed is you just have to make sure all your UI updates happen at the end of a callback call (or worker thread), and then as soon as that function is over the UI will be able to update. My scenario is different since I’m not really interested in interactive updates together with the calculations, which is of course a more interesting case.
Here’s my current example app. It requires @spawn, although I’m not even sure having actual separate threads is really required. A task taking over would work in this case since my problem is just that updates from before the calculation don’t even happen. It doesn’t really matter for me if it all gets blocked.
using Gtk
using LinearAlgebra
import Base.Threads.@spawn
b = Gtk.Button("oi")
ll = Gtk.Label("output")
hb = Gtk.Box(:v)
w = Gtk.Window("x")
push!(hb,b)
push!(hb,ll)
push!(w, hb)
state = :startcomp
signal_connect(b, "clicked") do widget
global state
if state == :startcomp
@info "Button clicked 1"
GAccessor.text(ll,"Running your long calculation...")
state = :computing
@spawn dolongcomp()
end
end
function dolongcomp()
global state
niter = 100000000
mypi = calcpi(niter)
@info mypi
GAccessor.text(ll,"done, mypy=$mypi")
state = :startcomp
end
function calcpi(niter)
acc = 0
for n in 1:niter
if norm(rand(2)) < 1.0
acc += 1
end
end
return 4*acc/niter
end
showall(w)
I had some great experience some time ago writing a Scala + Akka GUI where one actor runs in the main thread, and is the only one allowed to perform UI actions. Computations are performed by other actors which run in a separate thread pool, and communicate with the GUI actor. I would love to figure out how to do something like that in Julia. Tasks and Channels might provide enough capability for it, although I’m not sure how to even start. My example app right now is not so great because we have some logic tied straight to a button callback, and the other UI update should be triggered by some kind of custom signal. I don’t know if Gtk allows you to implement this.