====== 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 ); }