From 155f1fde496fae6249e8e4939ee24772ae5b2344 Mon Sep 17 00:00:00 2001 From: stffabi Date: Wed, 1 Dec 2021 13:24:19 +0100 Subject: [PATCH] [v2] Do not block during processing of messages On windows blocking here results in a blocked main thread and a blocked webview. --- .../frontend/desktop/darwin/frontend.go | 35 +++++++------- .../frontend/desktop/linux/frontend.go | 46 ++++++++++--------- .../frontend/desktop/windows/frontend.go | 39 +++++++++------- 3 files changed, 66 insertions(+), 54 deletions(-) diff --git a/v2/internal/frontend/desktop/darwin/frontend.go b/v2/internal/frontend/desktop/darwin/frontend.go index c9c38e2e..6acf6116 100644 --- a/v2/internal/frontend/desktop/darwin/frontend.go +++ b/v2/internal/frontend/desktop/darwin/frontend.go @@ -239,23 +239,26 @@ func (f *Frontend) processMessage(message string) { // return //} - result, err := f.dispatcher.ProcessMessage(message, f) - if err != nil { - f.logger.Error(err.Error()) - f.Callback(result) - return - } - if result == "" { - return - } + go func() { + result, err := f.dispatcher.ProcessMessage(message, f) + if err != nil { + f.logger.Error(err.Error()) + f.Callback(result) + return + } + if result == "" { + return + } + + switch result[0] { + case 'c': + // Callback from a method call + f.Callback(result[1:]) + default: + f.logger.Info("Unknown message returned from dispatcher: %+v", result) + } + }() - switch result[0] { - case 'c': - // Callback from a method call - f.Callback(result[1:]) - default: - f.logger.Info("Unknown message returned from dispatcher: %+v", result) - } } func (f *Frontend) Callback(message string) { diff --git a/v2/internal/frontend/desktop/linux/frontend.go b/v2/internal/frontend/desktop/linux/frontend.go index 9a34722a..d082a8f1 100644 --- a/v2/internal/frontend/desktop/linux/frontend.go +++ b/v2/internal/frontend/desktop/linux/frontend.go @@ -24,11 +24,6 @@ import "C" import ( "context" "encoding/json" - "github.com/wailsapp/wails/v2/internal/binding" - "github.com/wailsapp/wails/v2/internal/frontend" - "github.com/wailsapp/wails/v2/internal/frontend/assetserver" - "github.com/wailsapp/wails/v2/internal/logger" - "github.com/wailsapp/wails/v2/pkg/options" "log" "os" "strconv" @@ -36,6 +31,12 @@ import ( "sync" "text/template" "unsafe" + + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/frontend" + "github.com/wailsapp/wails/v2/internal/frontend/assetserver" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/pkg/options" ) type Frontend struct { @@ -235,23 +236,26 @@ func (f *Frontend) processMessage(message string) { //} return } - result, err := f.dispatcher.ProcessMessage(message, f) - if err != nil { - f.logger.Error(err.Error()) - f.Callback(result) - return - } - if result == "" { - return - } - switch result[0] { - case 'c': - // Callback from a method call - f.Callback(result[1:]) - default: - f.logger.Info("Unknown message returned from dispatcher: %+v", result) - } + go func() { + result, err := f.dispatcher.ProcessMessage(message, f) + if err != nil { + f.logger.Error(err.Error()) + f.Callback(result) + return + } + if result == "" { + return + } + + switch result[0] { + case 'c': + // Callback from a method call + f.Callback(result[1:]) + default: + f.logger.Info("Unknown message returned from dispatcher: %+v", result) + } + }() } func (f *Frontend) Callback(message string) { diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index 5de93d23..7804636c 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -259,7 +259,9 @@ func (f *Frontend) WindowSetRGBA(col *options.RGBA) { } func (f *Frontend) Quit() { - winc.Exit() + // Exit must be called on the Main-Thread. It calls PostQuitMessage which sends the WM_QUIT message to the thread's + // message queue and our message queue runs on the Main-Thread. + f.mainWindow.Invoke(winc.Exit) } func (f *Frontend) setupChromium() { @@ -398,23 +400,26 @@ func (f *Frontend) processMessage(message string) { } return } - result, err := f.dispatcher.ProcessMessage(message, f) - if err != nil { - f.logger.Error(err.Error()) - f.Callback(result) - return - } - if result == "" { - return - } - switch result[0] { - case 'c': - // Callback from a method call - f.Callback(result[1:]) - default: - f.logger.Info("Unknown message returned from dispatcher: %+v", result) - } + go func() { + result, err := f.dispatcher.ProcessMessage(message, f) + if err != nil { + f.logger.Error(err.Error()) + f.Callback(result) + return + } + if result == "" { + return + } + + switch result[0] { + case 'c': + // Callback from a method call + f.Callback(result[1:]) + default: + f.logger.Info("Unknown message returned from dispatcher: %+v", result) + } + }() } func (f *Frontend) Callback(message string) {