www.mikrocontroller.net

Forum: PC-Programmierung c#: while() bis timerRead_tick


Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich versuche mich gerade an einem kleinen "progrämmchen" und möchte hier 
in einer while-schleife warten, bis ein timerRead_tick ausgeführt wurde.

mein Problem ist, dass sobald ich in die while-schleife komme, der 
timer-read_tick nicht mehr aufgerufen wird (obwohl die Zeit bereits 
abelaufen ist).

Ich dachte dass ein timer_tick wie ein interrupt immer aufgerufen 
wird, also dass die Schleife für die Abarbeitung des ticks unterbrochen 
wird, das ist aber nicht so!

Wie stelle ich soetwas an?


Um es zu konkretisieren: ich muss in meinem Programm auf eine Eingabe 
warten und in dem Timer_read_tick prüfe ich die Schnittstelle, ob die 
Eingabe bereits gemacht ist!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube kaum das jemand ohne ein stücken Quellcode etwas sinnvolles 
dazu sagen kann ausser - hast du "volatil" beachtet?

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Frage ist vielmehr: wie muss ich einen timer_tick deklarieren dass 
er auch aufgerufen wird, wenn das Prgoramm (anderweitig) in einer 
while-Schleife steckt.
im Moment verlässt das programm die while nicht, der breakpoint im timer 
wird nicht angesprungen.

Autor: Sascha H. (legroeder2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist der Timer enabled? Welchen Timer benutzt du überhaupt? Quellcode 
wäre sehr hilfreich.

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja sorry, hier der code:
private void tmrRead_Tick(object sender, EventArgs e)
{
    ISprogMsg MyMsg;
    ISResult Res;
    
    do
    {
        Res = ISprog.Read(ActiveHardware, out MyMsg);

        if (Res == ISResult.ERR_OK)
            ProcessMessage(MyMsg);
    } while (!Convert.ToBoolean(Res & ISResult.ERR_QRCVEMPTY));
}

ich habe ganz oben bei der "do" einen breakpoint, hier kommt das 
Programm auch wie erwartet hin, sobald ich aber in einer anderen 
Funktion in der while-Schleife bin, komme ich oben nicht mehr zum 
Breakpoint.

In der ProcessMessage ist die Abbruchbedingung für die while-Schleife - 
soweit komme ich ja aber nicht

Autor: Sascha H. (legroeder2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer_tick lässt auf System.Windows.Forms.Timer schliessen, läuft das 
ganze denn innerhalb einer WinForms Anwendung? Der Winforms-Timer 
braucht nämlich die Message Loop um zu laufen.

(s. Beispiel auf 
http://msdn.microsoft.com/en-us/library/system.win...)

Außerdem ist der Timer Single-Threaded und nicht reentrant, d.h. solange 
du dich in der do-while Schleife befindest wird das Tick-Event kein 2. 
Mal ausgelöst.

Und, wenn Du mit deiner anderen while-Schleife den GUI-Thread lahmlegst 
wird da auch kein Tick-Event gefeuert.

Gruß,

Sascha

Autor: Sascha H. (legroeder2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Beispiel dazu nochmal dieser Schnipsel:
namespace ConsoleApplication1
{
    using System;
    using System.Threading;
    using System.Windows.Forms;

    using Timer = System.Windows.Forms.Timer;

    public class Program
    {
        public static void Main(string[] args)
        {
            Timer tmr = new Timer { Interval = 500 };
            tmr.Tick += tmr_Tick;
            tmr.Start();

            do
            {
                Application.DoEvents();
            }
            while (Console.ReadKey().Key != ConsoleKey.Q);

        }

        static void tmr_Tick(object sender, EventArgs e)
        {
            Console.WriteLine("Timer Tick!");

            int counter = 0;

            do
            {
                counter++;
                Console.WriteLine("Counter erhöht: {0}", counter);

                Thread.Sleep(100);
            }
            while (counter < 50);
        }
    }
}

Obwohl der Timer alle 500ms ticken sollte passiert hier nur was ("Timer 
Tick!"), wenn die Schleife vollständig durchlaufen worden ist. Nimmst Du 
das Application.DoEvents(); aus der 2. Schleife raus, dann passiert 
genau gar nichts.

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bingo, das wars!!!
Danke!

Autor: Sascha H. (legroeder2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was war es denn?

Gerne ;-)

Sascha

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei "Application.DoEvents()" mit Vorsicht zu genießen ist. Dein 
Programm befindet sich dann in einem nicht mehr definierten Zustand, da 
du nicht weiß, wie viele Events dann bearbeitet werden und ob du 
vielleicht sogar in einer anderen Schleife hängen bleibst. Stichwort 
"Deadlock"

Autor: Sascha H. (legroeder2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deshalb hatte ich extra nochmal nachgefragt, was Ihm denn nun geholfen 
hatte.

Application.DoEvents() ist nicht grade die sauberste Art und Weise für 
Nebenläufigkeit in einer GUI-Applikation.

Ich gehe aber davon aus, dass "Ich" nicht mehr antworten wird.

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ist ja leider meistens so. Wenn man sein Problem gelöst hat, 
meldet man sich nicht wieder. Problem ist ja gelöst. Und Andere haben 
das Problem bestimmt nicht. -.-

Autor: Stefan S. (stefan_s56)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
doch genau ICH habe das selbe Problem und möchte es nicht "unschön" 
lösen
Ich probiers nun einfach mal hier, sonst mache ich evtl. ein neuen 
Thread auf

Sascha H. schrieb:
>             do
>             {
>                 Application.DoEvents();
>             }
>             while (Console.ReadKey().Key != ConsoleKey.Q);

Bei mir sollten nicht alle Events die in dieser Zeit auf tauchen 
ausgeführt werden. Dies könnte unter Umständen eine längere Zeit sein 
als gewünscht.

Habe mich selber mal auf die Suche durchs www gemacht und dies wird wohl 
meine auserkorene Lösung sein:
DateTime start = DateTime.Now;
Thread.Sleep(2000);
DateTime end = DateTime.Now;

Response.Write("Start: " + start + "
");
Response.Write("Ende: " + end + "
");
Response.Write("Dauer: " + end.Subtract(start).TotalSeconds);

Autor: bluppdidupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach nen Thread nehmen ;D

Autor: Stefan S. (stefan_s56)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bluppdidupp schrieb:
> Einfach nen Thread nehmen ;D

einfach?! vielleicht wenn nichts zurück gegeben wird
Sonst muss man sich wieder um die sync. kümmern

Autor: bluppdidupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, aber je nachdem wie das Problem tatsächlich aussieht kann das 
unter Umständen sehr einfach sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.