====== Manipolare i widgets da altri thread con Gtkmm ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//02/03/2018 - 16:39//** \\ \\
===== Versione con i thread =====
void mainWindow::incrementGtkProgressBar()
{
if (progress<=1.0)
{
label1->set_text("Progresso: "+std::to_string(int(progress*100))+" %");
progressBar->set_fraction(progress);
g_print("Progresso %f \n",progress);
}
}
void mainWindow::incrementProgressBar()
{
while(progress<=1.000)
{
//aggiorno l'interfaccia grafica non appena possibile
Glib::signal_idle().connect_once( sigc::mem_fun(*this, &mainWindow::incrementGtkProgressBar) );
progress=progress+0.10;
sleep(1);
}
g_print("Thread eseguito\n");
}
void mainWindow::on_button_clicked()
{
progress=0.00;
progressBar->set_fraction(0);
//lancio il thread
Glib::Threads::Thread::create(sigc::mem_fun(*this, &mainWindow::incrementProgressBar));
}
===== Versione con i timeout =====
bool mainWindow::incrementGtkProgressBar()
{
label1->set_text("Progresso: "+std::to_string(int(progress*100))+" %");
progressBar->set_fraction(progress);
return progress < 1.0;
}
bool mainWindow::incrementProgressBar()
{
g_print("Inside timeout...\n");
//Subito non appena possibile , compatibilmente le esigenze del ciclo
//principale delle gtk eseguo il metodo mainWindow::incrementGtkProgressBar
Glib::signal_idle().connect( sigc::mem_fun(*this, &mainWindow::incrementGtkProgressBar) );
progress=progress+0.002;
return progress < 1.0; //il timeout viene eseguito fintanto che la funzione non ritorna false
}
void mainWindow::on_button_clicked()
{
//Avvio un timeout di glib, ovvero una funzione che viene ripetuta ogni n (50) millisecondi
//finche' non ritorna false. Simula il comportamento di un thread.
Glib::signal_timeout().connect( sigc::mem_fun(*this, &mainWindow::incrementProgressBar), 50 );
}