2016-09-28 1 views
2

Hier ist ein Beispielcode, der eine Anzeige auf den Bildschirm bringt und den Fortschrittsbalken pro Sekunde um 1 Wert erhöht. Unter MacOS sehe ich die Fortschrittsbalkenaktualisierung nicht, es sei denn, ich ziehe das Fenster herum oder verändere es manuell mit der Maus. Irgendeine Idee, wie man die ganze Sache dazu zwingt, neu zu streichen? Ich rufe f.Refresh() und f.Update()Wie mache ich WxWidgets (mit Golang) Repaint-Fenster auf MacOS?

package main 

import "github.com/dontpanic92/wxGo/wx" 
import "time" 

var g wx.Gauge 

type MyFrame struct { 
    wx.Frame 
} 

func (f *MyFrame) startUpload() { 
    for { 
     time.Sleep(time.Second) 
     g.SetValue(g.GetValue() + 1) 
     f.Refresh() 
     f.Update() 
    } 
} 

func NewMyFrame() MyFrame { 
    f := MyFrame{} 
    f.Frame = wx.NewFrame(wx.NullWindow, -1, "Test Thread") 
    mainSizer := wx.NewBoxSizer(wx.HORIZONTAL) 
    g = wx.NewGauge(f, wx.ID_ANY, 100, wx.DefaultPosition, wx.NewSize(600, 40), 0) 
    f.SetSizer(mainSizer) 
    mainSizer.Add(g, 100, wx.ALL|wx.EXPAND, 50) 
    f.Layout() 
    go f.startUpload() 
    return f 
} 

func main() { 
    wx1 := wx.NewApp() 
    f := NewMyFrame() 
    f.Show() 
    wx1.MainLoop() 
    return 
} 

Update: Ich habe http://docs.wxwidgets.org/trunk/overview_thread.html gelesen und ich versuche, Code wie:

b := wx.NewPaintEvent() 
f.GetEventHandler().QueueEvent(b) 

statt Aktualisieren des Aufrufs und Update, aber mein wx.NewPaintEvent tut nichts. Vielleicht mache ich das wx.NewPaintEvent falsch? Oder ich füge es dem falschen EventHandler hinzu?

+0

Was ist OSX-Version? Was ist die WX-Version? Können Sie Wx erstellen und das Dialogfeld Beispiel versuchen? – Igor

+0

10.11.6, Master von github.com/dontpanic92/wxGo/wx das ist wxWidgets-3.1.0, ja das Beispiel enthalten baut gut, aber keine Threads wie mein Beispiel –

+0

haben Sie versucht, mit dem Messgerät und der zu arbeiten Fenster vom sekundären Thread? – Igor

Antwort

0

Autor wxGo es fest:

https://github.com/dontpanic92/wxGo/issues/10

wx.Bind(f, wx.EVT_THREAD, func(e wx.Event) { 
    threadEvent := wx.ToThreadEvent(e) 
    the_gauge.SetValue(threadEvent.GetInt()) 
    }, UPLOAD_WORKER_ID) 

dann im Thread:

threadEvent := wx.NewThreadEvent(wx.EVT_THREAD, UPLOAD_WORKER_ID) 
threadEvent.SetInt(50) 
f.QueueEvent(threadEvent) 
0

Im Allgemeinen wird alles, was mit GUI-Objekten aus dem Nicht-Haupt-Thread (d. H. Nicht dem, der die Bibliothek initialisiert hat) Thread wird nicht von WxWidgets unterstützt.

Die übliche Problemumgehung besteht darin, ein Ereignis an den Hauptthread zu senden, in dem es aufgefordert wird, das Widget zu aktualisieren, anstatt es direkt im Worker-Thread auszuführen. In C++ kann dies leicht und elegant unter Verwendung von CallAfter() durchgeführt werden, aber ich weiß nicht genug über Go und wxGo, um Ihnen ein Beispiel zu zeigen, wie man es in dieser Sprache macht.

+0

danke, ich habe http://docs.wxwidgets.org/trunk/overview_thread.html immer und immer wieder gelesen, aber ich kann mein wxPaintEvent, das ich dem WxEventHandler meines Frames hinzufüge, nicht tun, um irgendetwas zu tun. –

+0

Sie können 'wxPaintEvent' nicht direkt generieren, dies ist der Job für die zugrunde liegende GUI selbst. Sie müssen 'Refresh()' wirklich vom Hauptthread aufrufen. –