dunque ho fatto una prova che devi vedere se riesci a integrare nel tuo programma.
la teoria è questa. All'avvio del programma crei un thread separato, che sarà il thread che farà le operazioin rchieste per tutta la durata del tempo in cui il bottone è premuto, al rilasico del bottone il thread viene messo in pausa.
Nella prova che ho fatto io ho messo un contatore, inizialmente a zero, e il thread non fa altro che ciclare, incrementandolo di 1 ad ogni ciclo, per tutta la durata in cui un bottone è premuto. Il problema di questo sistema è che il numero di incrementi dipende dalla velocità del computer poichè non c'è nulla che scandisca il tempo. Ho fatto una prova e, con il mio pc, un click velocissimo sul bottone mi incrementa il contatore di circa 6.000.000. Se lascio premuto per un secondo il contatore mi arriva a circa 130.000.000.
Si può rallentare, ma non mi è venuto in mente nulla che lo renda indipendente dalla velocità del processore. L'unico modo sarebbe con lo sleep del thread fra un incremento e l'altro ma ritorneremmo al problema di partenza perchè l'unità minima dello sleep è di 1 ms.
cmq, l'esempio (in c#) che ho fatto è questo:
Ho un bottone (button1) e una textbox(textbox1) che visualizzaerà il valore del contatore.
Per interagire con il thread ho fatto un singleton, ecco il suo codice:
codice:
public class MySingleton
{
public int Contatore = 0;
private static readonly MySingleton instance = new MySingleton();
private bool _IsButtonPressed;
public bool IsButtonPressed
{
get{return _IsButtonPressed;}
set{_IsButtonPressed = value;}
}
public static MySingleton GetInstance()
{
return instance;
}
private MySingleton()
{
_IsButtonPressed = false;
}
}
il bottone ha 2 eventi: MouseDown e MouseUp: ecco il codice del form.
codice:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;
public class Form1 : System.Windows.Forms.Form
{
private Thread MyThread;
//segue il codice del designer
//.....
//.....
//Fine designer
private void Form1_Load(object sender, System.EventArgs e)
{
MyThread = new Thread(new ThreadStart(DoSomething));
MyThread.Start();
MyThread.Suspend();
}
private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
MySingleton.GetInstance().Contatore = 0;
MySingleton.GetInstance().IsButtonPressed = true;
MyThread.Resume();
}
private void button1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
MySingleton.GetInstance().IsButtonPressed = false;
textBox1.Text = MySingleton.GetInstance().Contatore.ToString("#,#");
MyThread.Suspend();
}
private void DoSomething()
{
MySingleton MySingletonInstance = MySingleton.GetInstance();
while(true)
{
while(MySingletonInstance.IsButtonPressed)
{
//for(int i = 0; i < 100000; i++){} //Questa la puoi decommentare per rallentare l'incremento... ma resta comunque dipendente dalla velocità del processore
MySingletonInstance.Contatore += 1;
}
}
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
MyThread.Resume();
MyThread.Abort();
}