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  }