// gui runs f in the main GUI thread and waits for f to return. func gui(f func()) { if tref.Ref() == guiLoopRef { // Already within the GUI thread. Attempting to wait would deadlock. f() return } // Tell Qt we're waiting for the idle hook to be called. if atomic.AddInt32((*int32)(unsafe.Pointer(&hookWaiting)), 1) == 1 { C.idleTimerStart() } // Send f to be executed by the idle hook in the main GUI thread. guiFunc <- f // Wait until f is done executing. <-guiDone }
// RunMain runs f in the main QML thread and waits for f to return. // // This is meant to be used by extensions that integrate directly with the // underlying QML logic. func RunMain(f func()) { ref := cdata.Ref() if ref == guiMainRef || ref == atomic.LoadUintptr(&guiPaintRef) { // Already within the GUI or render threads. Attempting to wait would deadlock. f() return } // Tell Qt we're waiting for the idle hook to be called. if atomic.AddInt32(&guiIdleRun, 1) == 1 { C.idleTimerStart() } // Send f to be executed by the idle hook in the main GUI thread. guiFunc <- f // Wait until f is done executing. <-guiDone }