1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
{
// quelques part quand je crée les widgets
// émet un signal dès que l'un des critères change
nom_entry->signal_changed().connect(SigC::slot(*this, &recherche_client::do_update));
prenom_entry->signal_changed().connect(SigC::slot(*this, &recherche_client::do_update));
adresse_entry->signal_changed().connect(SigC::slot(*this, &recherche_client::do_update));
code_postal_entry->signal_changed().connect(SigC::slot(*this, &recherche_client::do_update));
(ville_comboboxentrytext->get_entry())->signal_changed().connect(SigC::slot(*this, &recherche_client::do_update));
}
void
recherche_client::do_update()
{
try {
Glib::Thread * search_thread_ptr = NULL;
// ici on récupère les critères
if (_M_search_started) // si un thread de recherche est lancé
{
Glib::Thread * wait_thread_ptr = Glib::Thread::create(sigc::mem_fun(this, &recherche_client::wait_thread), true);
wait_thread_ptr->join();
}
// vide le contenu de la treeview
_M_refListStore->clear();
_M_search_finished = false;
// lance le thread de recherche sans attendre la fin de son éxécution
search_thread_ptr = Glib::Thread::create(sigc::mem_fun(this, &recherche_client::store_thread), true);
if (search_thread_ptr != NULL)
{
_M_search_started = true;
}
}
catch (CEngineException &e)
{
exception_dialog dialog(e);
dialog.run();
}
}
void
recherche_client::wait_thread()
{
// indique à la fonction de recherche d'arréter la boucle
// de remplissage du tampon
CEngine::Instance().stop_search();
// permet de sortir de la boucle d'affichage de la treeview
_M_search_complete = false;
{
Glib::Mutex::Lock lock (mutex_);
while (!_M_search_finished)
_M_cond_search_finished_.wait(mutex_);
}
}
void
recherche_client::store_thread()
{
CClientList client_list;
{
Glib::Mutex::Lock lock (mutex_);
CEngine::Instance().rechercheClient(_M_client_search, client_list);
_M_search_complete = CEngine::Instance().is_search_complete();
if ((client_list.size() > 0) && (_M_search_complete))
{
CClientList_Const_Iterator it;
Gtk::TreeModel::Row row;
for (it = client_list.begin(); it != client_list.end(); it++)
{
// ici on met à jour la treeview
if (!_M_search_complete) break;
}
}
_M_search_started = false;
_M_search_finished = true;
_M_cond_search_finished_.signal();
}
} |
Partager