2.8k Aufrufe
Gefragt in Anwendungen(Java,C++...) von cyberrob Mitglied (737 Punkte)
Hallo,

ich nutze Microsoft Visual Studio 2010 und versuche gerade vergeblich, einen Timer im Hintergrund laufen zu lassen, nachdem ich auf einen Button geklickt habe.

Über die MSDN Site von Microsoft finde ich ein gutes Codebeispiel, das ich nachvollziehen und verstehen kann:


public class Class1 {
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
static int alarmCounter = 1;
static bool exitFlag = false;

// This is the method to run when the timer is raised.
private static void TimerEventProcessor(Object myObject,
EventArgs myEventArgs) {
myTimer.Stop();

// Displays a message box asking whether to continue running the timer.
if(MessageBox.Show("Continue running?", "Count is: " + alarmCounter,
MessageBoxButtons.YesNo) == DialogResult.Yes) {
// Restarts the timer and increments the counter.
alarmCounter +=1;
myTimer.Enabled = true;
}
else {
// Stops the timer.
exitFlag = true;
}
}

public static int Main() {
/* Adds the event and the event handler for the method that will
process the timer event to the timer. */
myTimer.Tick += new EventHandler(TimerEventProcessor);

// Sets the timer interval to 5 seconds.
myTimer.Interval = 5000;
myTimer.Start();

// Runs the timer, and raises the event.
while(exitFlag == false) {
// Processes all the events in the queue.
Application.DoEvents();
}
return 0;
}
}

Versuche ich nun, dieses zu implementieren, sagt mir die Entwicklerumgebung, die Form System.Windows.Forms, also Forms, gibts nicht. ?
Warum nicht?

Gibt es eine andere Lösung, einen simplen Timer zu erstellen?
Mir gehts nur darum, einen Timer zu haben, der mind. halbe Sekunden zählen kann, nach 5 sekunden abbricht und die Möglichkeit bietet, alle halbe Sekunde einen Befehl auszuführen.
Das hätte ich eben über eine simple if Abfrage gemacht, ob der Wert = 1/2 sec, dann =1sec ist, etc.

Bin leicht irritiert, dass sich Code Beispiele aus dem Internet in dieser Entwicklerumgebung nicht anwenden lassen. Hatte auch schon andre Codebeispiele, die ebenfalls nicht gefressen wurden, die ich aber auch nicht vollständig nachvollziehen konnte, drum lieber dieses hier.
Geht um die Entwicklung einer WindowsPhone 7.1 App

Freu mich über jede Hilfe.

Mit freundlichen Grüßen,
Cyberrob

4 Antworten

0 Punkte
Beantwortet von cyberrob Mitglied (737 Punkte)
Ok, man müsste es wohl mit
system.threading.Timer .
lösen.
Aber da weiß ich nicht, wie ich einen generiere, bzw. den Tick schreibe, damit er auch zählt.
0 Punkte
Beantwortet von cyberrob Mitglied (737 Punkte)
Also mit dem Code hier würde es prinzipiell zwar funktionieren:

System.Threading.Timer Timer;
bool endProcess = false;
int i = 0;

protected void Page_Load(object sender, EventArgs e)
{

Timer = new System.Threading.Timer(TimerCallback, null, 10, 10);
Label1.Text = i.ToString();
i++;
}

private void TimerCallback(object state)
{

if (endProcess == true)
{
Timer.Dispose();
return;
}
}

public void Button1_Click(object sender, System.EventArgs e)
{
endProcess = true;
}

Aber dann wird nur ne 0 ausgegeben und man kommt nicht mehr weiter.
Vllt. dazu ne Idee?
0 Punkte
Beantwortet von cyberrob Mitglied (737 Punkte)
Möglicherweise wäre die sauberere Lösung hier eine while...do-Schleife, die i um 1 erhöht?
Ich geh nämlich mal stark davon aus, dass es eine Millisekunde braucht, um i um 1 zu erhöhen.?
0 Punkte
Beantwortet von cyberrob Mitglied (737 Punkte)
Ok, die Lösung funktioniert prinzipiell...
Aber i erhöht deutlich schneller als eine Millisekunde, was wiederum recht ärgerlich ist...
...