Ho un metodo come questo nel mio codice UI:
void MyDialog::OnCommandSaveData()
{
std::list<MyClass*> objects;
service_->GetAll(objects);
dataService_->SaveObjects(objects);
AddMessage("Saved data.\n");
}
Perché questo metodo può richiedere del tempo, voglio dare il via a una discussione per farlo. Sto usando C ++ e ho intenzione di utilizzare Boost.Thread . Quindi la mia domanda è come fare al meglio. La mia comprensione è che ho bisogno di creare una funzione statica, un metodo statico o un functor che conterrà il codice precedente. Dove dovrebbe vivere, nella classe di dialogo? Sembra solo sbagliato, ma di nuovo forse no.
E quindi ho bisogno di un mutex e blocco almeno il metodo SaveObjects. Dove dovrebbe vivere il mutex e dove metto il lucchetto?
La maggior parte degli esempi di threading, come con esempi di così tante cose, non mostrano il thread nel contesto di un'applicazione reale. Mostrano un metodo principale con una funzione globale e basta. Quindi, se puoi indicarmi un esempio di una classe che gestisce il threading per un'operazione che sarebbe grandiosa.
Compro la logica nella risposta accettata a questa domanda: È" errato "/ Design errato per inserire un thread / background worker in una classe? Tuttavia, la risposta ti dice solo perché farlo, non come .
Aggiorna
Ho refactored il mio codice usando MVP (Model View Presenter) / Humble Dialog Box:
void MyDialog::OnCommandSaveData()
{
presenter_->SaveData();
}
Quindi ora dovrò considerare l'aggiunta di multi-threading nel contesto di MVP.
UPDATE 2
Ho trovato questo articolo che parla della creazione di winform con multithreading usando MVP. È in C # quindi dovrò tradurlo in C ++ ma sembra buono:
Sostanzialmente si tratta di 1) creare un ThreadSafeView
che è un wrapper o un proxy attorno alla tua vista che consente alla tua vista di essere aggiornata da un thread di lavoro. E 2) creando un ThreadedPresenter
che consente ai metodi del presentatore di generare un nuovo thread. Mi piace molto il modo in cui questo isola il codice di threading dalla vista e dal codice del presentatore.