webForumDet fria alternativet

Problem med trådar och timers

.NET

1 svar · 214 visningar · startad av Viktor

Medlem sedan aug. 20021 752 inlägg
Frågan#1

Hej

Jag har en tråd som fungerar som en kö hanterare, den startar en händelse om det finns något i kön, händelsen den startar startar i sin tur en timer men när man kör detta genom en tråd så fungerar inte timern. Har gjort ett litet exempel program som har samma "fel",

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;

class TimerDemo:Form
{
	System.Windows.Forms.Timer Clock;
	int count=0;
	Label lbTime=new Label();
	static TimerDemo instance=null;
	private Thread queueThread=null;

	public TimerDemo()
	{
		instance=this;
		this.Controls.Add(lbTime);
		queueThread=new Thread(new ThreadStart(this.ThreadWorker));
		queueThread.Start();
	}

	public void ThreadWorker()
	{
		instance.Show();
	}

	new public void Show()
	{
		Clock=new System.Windows.Forms.Timer();
		Clock.Interval=1000;
		Clock.Start();
		Clock.Tick+=new EventHandler(Timer_Tick);
		lbTime.Text="New Timer Started";
		count=0;
	}

	public void Timer_Tick(object sender,EventArgs eArgs)
	{
		lbTime.Text="Ticks: "+(++count);
	}

	public static void Main()
	{
		Application.Run(new TimerDemo());
	}
}

När man kör detta program så kommer det upp "New Timer Started", altså funktionen Show anroppas, men "Ticks: 1" osv visas aldrig. Om man däremot anroppar Show direkt från konstruktorn utan tråd så fungerar det perfekt.

/Viktor

Medlem sedan aug. 20021 752 inlägg
#2

Löste det genom att använda "System.Threading.Timer" istället för "System.Windows.Forms.Timer",

using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

class TimerDemo:Form
{
	System.Threading.Timer timer;
	int count=0;
	Label lbTime=new Label();
	static TimerDemo instance=null;
	private Thread queueThread=null;

	public TimerDemo()
	{
		instance=this;
		this.Controls.Add(lbTime);
		queueThread=new Thread(new ThreadStart(this.ThreadWorker));
		queueThread.Start();
	}

	public void ThreadWorker()
	{
		instance.Show();
	}

	new public void Show()
	{
		TimerCallback timerDelegate = new TimerCallback(this.Timer_Tick);
		timer = new System.Threading.Timer(timerDelegate,null,1000, 1000);
		lbTime.Text="New Timer Started";
		count=0;
	}

	public void Timer_Tick(object state)
	{
		lbTime.Text="Ticks: "+(++count);
	}

	public static void Main()
	{
		Application.Run(new TimerDemo());
	}
}

/Viktor

261 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)