Laden...

Variable wird nicht aktualisiert.

Erstellt von kuppi vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.134 Views
K
kuppi Themenstarter:in
44 Beiträge seit 2006
vor 17 Jahren
Variable wird nicht aktualisiert.

Hallo ihr C# Spezialisten,

ich hoffe ihr habt Geduld mit einem Delphi Umsteiger.
Die im Public Teil angelegten Variablen werden nicht aktualisiert.
Die oldTicks etc werden von einem anderen Wert abgezogen, aber sie haben scheinbar den wert 0, das gilt für alle oldxyz Variablen.
Wahrscheinlich sieht der Profi den Fehler auf einen Blick.

hoffnungsvolle Grüße von kuppi

hier der Code:

namespace Heizung
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        PortBit aPortBit;
        ThreadStart myTS; 
        Thread portThread; 
        Queue aList;
        Queue MsgList;
        long oldTicks = 0;
        float oldWatt = 0;
        float watt = 0;
        long Ticks = 0;
        float wattjeStd = 0;

        private void init_HW()
        {
            aList = new Queue();
            MsgList = Queue.Synchronized(aList);

            aPortBit = new PortBit(530);
            aPortBit.MsgList = this.MsgList;
            aPortBit.Bits[0].ID = IDConst.idStromWP;
            aPortBit.Bits[0].Typ = MsgConst.KWMsg;
            aPortBit.Bits[0].Use = true;
            aPortBit.Bits[1].ID = IDConst.idStromHaus;
            aPortBit.Bits[1].Typ = MsgConst.KWMsg;
            aPortBit.Bits[1].Use = true;

            myTS = new ThreadStart(aPortBit.Threadloop);
            portThread = new Thread(myTS);
            portThread.Priority = ThreadPriority.Highest;
            
            
        }
        private void msgTimer_Tick(object sender, EventArgs e)
        {
            // die Nachrichten von der MsgList abholen
            HeizMsg aMsg;
            while (MsgList.Count > 0)
            {
                aMsg = (HeizMsg)MsgList.Dequeue(); // Msg holen, typcast von object nach heizmsg
                switch (aMsg.Typ)
                {
                    case MsgConst.KWMsg: KWMessage(aMsg); break;
                    case MsgConst.ADCMsg: ADCMessage(aMsg); break;
                }
            }
            
        }
        private void KWMessage(HeizMsg aMsg)
        { // hier die KW Messages verarbeiten
            switch (aMsg.ID)
            {
                case IDConst.idStromWP: ; break;
                case IDConst.idStromHaus:
                    if (oldTicks == 0)
                    {
                        oldTicks = aMsg.MsgDateTime.Ticks;
                        oldWatt = aMsg.Value;
                        ed_if1.Text = oldWatt.ToString("f2");
                    }
                    else
                    {
                        watt = aMsg.Value - oldWatt;
                        Ticks = aMsg.MsgDateTime.Ticks - oldTicks;
                        wattjeStd = watt /Ticks * 3600000;
                        oldWatt = watt;
                        oldTicks = Ticks;
                        tb_counts.Text = wattjeStd.ToString("f2");
                        tb_watt.Text = watt.ToString("f2");
                        tb_msec.Text = Ticks.ToString("f2");
                    }   
                    break;
            }

        }
        private void ADCMessage(HeizMsg aMsg)
        { // hier die ADC Messages verarbeiten
        }

        private void button1_Click(object sender, EventArgs e)
        {// porthread starten
            init_HW();
            portThread.Start();
            msgTimer.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            aPortBit.Terminate();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Single zahl = 1.23455F;
            textBox1.Text = zahl.ToString("f4");
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        
        
    }
}
L
497 Beiträge seit 2006
vor 17 Jahren

Ich gehe einfach mal davon aus, dass entweder die Events nicht ausgelöst oder die case-Zweige nicht erreicht werden. Versuche mal zu debuggen oder ein paar Ausgaben reinzumachen, um das Problem einzugrenzen.

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

K
kuppi Themenstarter:in
44 Beiträge seit 2006
vor 17 Jahren

Leider ist es nicht so einfach,

die Procedure KWMessage wird aufgerufen, der else Zweig durchlaufen.
in aMsg.Value ist ein Wert der jeweils um 1 hochgezählt wird, wenn ich oldwatt davon abziehe müsste jeweils in der Ausgabe 1 erscheinen, ich sehe aber immer den weiter auflaufenden Wert.

kuppi

L
497 Beiträge seit 2006
vor 17 Jahren

Das ist wirklich nahezu unmöglich (zumindest mir) bei dem Problem "aus der Ferne" zu helfen. Was evtl. noch sein könnte, dass hier: wattjeStd = watt /Ticks * 3600000; Ticks gleich 0 ist und dass es eine Exception gibt, da man ja nicht durch 0 teilen kann (zumindest nehme ich das an). Dadurch würden dann die nachfolgenden Zeilen und somit die Zuweisung an oldWatt nicht mehr ausgeführt.

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

347 Beiträge seit 2006
vor 17 Jahren

Ich habe mir deinen Code nicht weiter angesehen, was Delphiumsteiger gerne vergessen ist, dass in .Net Int32 / Int32 Int32 ergibt., während du unter Delphi einen Real bekamst. 😉

btw: nächstes Mal bitte csharp-Tags anstatt code nehmen. 😉