webForumDet fria alternativet

Timer-problem

1 svar · 228 visningar · startad av aleborg

aleborgMedlem sedan jan. 20012 962 inlägg
#1

Jag har en winform där jag har följande kod:

private Timer Clock;
public void LoadUser(int userid)
{
	//.....kod
	this.StartClock();
}
private void Form1_Load(object sender, System.EventArgs e)
{
	CheckForUpdate(false);
	Clock = new Timer();
}
private void Timer_Tick(object sender, System.EventArgs e)
{
	this.StopClock();
	Kundregister.Controls.LasningPopUp f = new Kundregister.Controls.LasningPopUp();
	f.ShowDialog(this);
}
public void StartClock()
{
	this.Clock.Interval=1200000;
	this.Clock.Tick+=new EventHandler(Timer_Tick);
	this.Clock.Start();		
}
public void StopClock()
{
	this.Clock.Stop();		
}
public void CloseUser()
{
	//...kod
	MessageBox.Show("Kunden har stängts!");
}

Kundregister.Controls.LasningPopUp ser ut så här:

private int i=0;
private Timer Clock;
private void LasningPopUp_Load(object sender, System.EventArgs e)
{
		i = 20;
		Clock = new Timer();
		this.StartClock();
}
private void StartClock()
{
	i = 20;
	this.Clock.Start();
	this.Clock.Interval=1000;
	this.Clock.Tick+=new EventHandler(Timer_Tick);
}
private void Timer_Tick(object sender, System.EventArgs e)
{
	i=i-1;
	lblLasning.Text = i.ToString()+ " sekunder";
	if(i==0)
	{
		this.StopClock();
		this.Close();
		((Form1)this.Owner).CloseUser();
	}
}
private void StopClock()
{
	this.Clock.Stop();
}
private void ultraButton2_Click(object sender, System.EventArgs e)
{
	this.StopClock();
	this.Close();
	((Form1)this.Owner).CloseUser();
}

private void ultraButton1_Click(object sender, System.EventArgs e)
{
	this.StopClock();
	this.Close();
	((Form1)this.Owner).StartClock();
}

Av någon konstig anledning så kommer fönstret LasningPopUp upp på nytt ibland när man klickar på ultraButton2 eller när i==0, ibland kommer det upp 5 ggr på raken. Har testat allt möjligt men nu kan jag inte se nått som kan orsaka att det poppar upp igen.
Nån som kan Timern och vet vad orsaken kan vara?

emissionMedlem sedan dec. 19996 095 inlägg
#2

Felet är att du lägger till event-delegaten

this.Clock.Tick+=new EventHandler(Timer_Tick);

...i en metod som kan köras flera gånger.

Varje gång StartClock körs så kommer en ny delegat att läggas till på Tick-eventet, och med andra ord körs Timer_Tick-metoden flera gånger på raken (dock väntar den på att LasningPopUp stängs, eftersom den öppnas modalt.)

Flytta den ovanstående raden hit:

Clock = new Timer();
Clock.Tick+=new EventHandler(Timer_Tick);

121 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
119 ms — hämta tråd, inlägg och bilagor (db)