github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/client/GUI/common/threads.go (about) 1 package common 2 3 import ( 4 "github.com/benoitkugler/goACVE/client/controllers" 5 "github.com/benoitkugler/goACVE/server/core/apiserver" 6 7 "errors" 8 9 "github.com/benoitkugler/goACVE/client/GUI/basic" 10 "github.com/therecipe/qt/core" 11 ) 12 13 type Background struct { 14 thread *core.QThread 15 out interface{} 16 err error 17 } 18 19 func (b Background) ensureFree() bool { 20 if b.thread.IsRunning() { 21 basic.ShowError(errors.New(`Une tâche d'arrière plan est déjà <b>en cours d'éxécution</b> !<br/> 22 Veuillez patienter jusqu'à son accomplissement.`)) 23 return false 24 } 25 return true 26 } 27 28 func (b *Background) Run(job func() (interface{}, error), onSucces func(output interface{})) { 29 thread := core.NewQThread(nil) 30 thread.ConnectRun(func() { 31 b.out, b.err = job() 32 }) 33 thread.ConnectFinished(func() { 34 if b.err != nil { 35 basic.ShowError(b.err) 36 return 37 } 38 onSucces(b.out) 39 }) 40 if !b.ensureFree() { 41 return 42 } 43 b.thread = thread 44 b.thread.Start() 45 } 46 47 type baseSender struct { 48 core.QThread 49 50 outFacErrors []controllers.DossierError 51 outError error 52 53 OnFinished func([]controllers.DossierError, error) // effectué dans le thread principal 54 } 55 56 type MailsSender struct { 57 baseSender 58 59 _ func(index int, err string) `signal:"onError"` 60 _ func(index int, out apiserver.NotifieManyOut) `signal:"onSuccess"` 61 62 Monitor controllers.SendMessagesSignals 63 } 64 65 // SetupLaunch effectue les connexion nécessaires 66 // et démarre le thread. 67 // `job` est effectué dans le thread secondaire tandis que 68 // les fonctions `OnError` et `OnSuccess` le sont dans le thread principal 69 func (th *MailsSender) SetupLaunch(job func(monitor controllers.SendMessagesSignals) ([]controllers.DossierError, error)) { 70 th.ConnectOnError(th.Monitor.OnError) 71 th.ConnectOnSuccess(th.Monitor.OnSuccess) 72 73 th.ConnectRun(func() { 74 th.outFacErrors, th.outError = job(controllers.SendMessagesSignals{OnSuccess: th.OnSuccess, OnError: th.OnError}) 75 }) 76 th.ConnectFinished(func() { 77 th.OnFinished(th.outFacErrors, th.outError) 78 }) 79 th.Start() 80 } 81 82 type DocumentsSender struct { 83 baseSender 84 85 _ func(index int, err string) `signal:"onError"` 86 _ func(index int, out apiserver.NotifieDocumentsOut) `signal:"onSuccess"` 87 88 Monitor controllers.SendDocumentsSignals 89 } 90 91 func (th *DocumentsSender) SetupLaunch(job func(monitor controllers.SendDocumentsSignals) ([]controllers.DossierError, error)) { 92 th.ConnectOnError(th.Monitor.OnError) 93 th.ConnectOnSuccess(th.Monitor.OnSuccess) 94 95 th.ConnectRun(func() { 96 th.outFacErrors, th.outError = job(controllers.SendDocumentsSignals{OnSuccess: th.OnSuccess, OnError: th.OnError}) 97 }) 98 th.ConnectFinished(func() { 99 th.OnFinished(th.outFacErrors, th.outError) 100 }) 101 th.Start() 102 } 103 104 type SondagesSender struct { 105 baseSender 106 107 _ func(index int, err string) `signal:"onError"` 108 _ func(index int, out apiserver.NotifieSondagesOut) `signal:"onSuccess"` 109 110 Monitor controllers.SendSondagesSignals 111 } 112 113 func (th *SondagesSender) SetupLaunch(job func(monitor controllers.SendSondagesSignals) ([]controllers.DossierError, error)) { 114 th.ConnectOnError(th.Monitor.OnError) 115 th.ConnectOnSuccess(th.Monitor.OnSuccess) 116 117 th.ConnectRun(func() { 118 th.outFacErrors, th.outError = job(controllers.SendSondagesSignals{OnSuccess: th.OnSuccess, OnError: th.OnError}) 119 }) 120 th.ConnectFinished(func() { 121 th.OnFinished(th.outFacErrors, th.outError) 122 }) 123 th.Start() 124 }