Indice

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