Laden...
C
Chaosmaster myCSharp.de - Member
Ingenieur Stuttgart Dabei seit 16.09.2009 31 Beiträge
Benutzerbeschreibung

Forenbeiträge von Chaosmaster Ingesamt 31 Beiträge

17.12.2011 - 00:35 Uhr

Ich arbeite selbst ziemlich viel mit dem CAN Bus ... Was muss bei dir denn in "Echtzeit" erledigt werden? Und was passiert wenn die Echtzeit nicht eingehalten wird?

Wenn ich das richtig verstehe empfängst du nur und sendest selbst nicht, oder? Kann du dein Ziel noch etwas genauer Beschreiben?

11.11.2011 - 17:14 Uhr

Danke für Eure Antworten 😃

minWorker und minIOC haben beide den Wert 4 ... fühlt sich nach zu wenig an

10.11.2011 - 12:37 Uhr

Dass die Ursache bei Debug/Release liegt halte ich für unwahrscheinlich, habs trotzdem mal versucht -> keine Änderung.

Die Erklärung von herbivore ist natürlich richtig, das war mir vorher auch bekannt. Was mich nur verwundert ist der Unterschied von < 1ms bis > 500ms.

Es gibt auf jeden Fall bessere Lösungen, nur leider (bzw. zum Glück) handelt es sich nicht um meinen Code, d.h. ich versuche erstmal das Beste aus der bestehenden Lösung rauszuholen. Das ganze synchron zu machen fällt aufgrund des bestehenden Designs flach.

Meine Idee wäre, die OnFinishedMeasurement in einem eigenen Thread laufen zu lassen (und zwar die ganze Zeit) und anstelle des BeginInvoke über AutoResetEvent.Set die Verarbeitung anzutriggern.

10.11.2011 - 12:20 Uhr

Hallo zusammen,

ich sitze hier gerade bei der Fehlersuche in einem Programm und habe anscheinend die Ursache gefunden, jedoch keine Lösung.

Es wird zyklisch eine Funktion mit BeginInvoke aufgerufen, normalerweise liegen zwischen Aufruf des BeginInvoke und Eintritt in die Funktion < 1 ms. Sporadisch dauert es aber 600 bis 800 ms, bis die Funktion tatsächlich aufgerufen wird. Die Zeiten habe ich durch Logging ermittelt.

Der Aufruf:


_logger.Debug(Name + " - before BeginInvoke");
_measurementFinished.BeginInvoke( this, failed, MeasurementFinishedCallBack, null );

Die aufgerufene Funktion:


public virtual void OnFinishedMeasurement( IEquipment device, bool failed )
{
       _logger.Debug( device.Name +  " - OnFinishedMeasurement - Enter");
       ...

Hat jemand eine Idee woran das liegen könnte? Ich würde ja alles im einstelligen Millisekunden-Bereich verstehen, aber dann gleich ne knappe Sekunde?

03.11.2011 - 11:28 Uhr

Ohne Worte ...

			get
			{
				lock ( CriticalSection )
				{
					return 0;
				}
			}
07.07.2011 - 00:28 Uhr

Tipp von mir: Gewöhn Dir den Gedanken schnell ab ... es gibt mit Sicherheit eine elegantere Lösung für dein Problem.

07.07.2011 - 00:25 Uhr

Meiner Meinung nach ist Windows als Nicht-Echtzeitbetriebssystem für solche Messungen nicht geeignet. Du hast keine Kontroller darüber, wann deine Anwendung vom Scheduler wieder Rechenzeit bekommt ... der Test könnte bei unterschiedlicher Systemlast unterschiedlicher Ergebnisse liefern.

07.07.2011 - 00:17 Uhr

Hi,

was genau hast Du denn vor? Variablennamen dynamisch zu vergeben ist in C# nicht möglich.

Wenn Du eine variable Anzahl an Labels anlegen willst solltest Du das über ne Liste (List<Label>) machen ... und wenn Du über einen bestimmen String wieder auf ein Label zugreifen können willst könntest Du ein Dictionary nehmen.

Das waren jetzt aber Vermutungen, erläuter erstmal genau was Du vor hast.

Gruß

07.06.2011 - 14:12 Uhr

Und wie einfach das geht, habs nur in der Doku nicht gesehen. Sehr schön gelöst 😃

Danke für die schnelle Antwort.

07.06.2011 - 13:41 Uhr

Hi,

erstmal muss ich sagen, dass ich Dein Projekt richtig gut finde, habe momentan vor es bei einem Projekt von mir einzusetzen.

Es gibt nur eine Sache, die für mich ziemlich wichtig ist: Ist es möglich, ein bestimmes Update auszuwählen und zu installieren und nicht immer das neuste?

Hintergrund: Von meiner Anwendung gibt es verschiedene Varianten, und wenn das neuste Update für Variante A ist sollte Variante B natürlich nur die neuste Variante B installieren können.

Die verschiedenen Varianten erkenne ich über die CustomFields, ich würde nur noch eine Möglichkeit benötigen, ein bestimmtes Update auszuwählen.

Gruß
Mathias

14.02.2011 - 17:04 Uhr

Du könntest ja mal einen Ausschnitt von Deinen Code posten ...

14.02.2011 - 16:54 Uhr

Sehe ich das richtig, dass oben erst mal eine Art Index der vorhanden Blöcke kommt und danch die Blöcke mit ihren Inhalten? Und das R steht dafür, dass der Block bearbeitet nicht werden darf?

Warum kommst Du mit Regex nicht weit? Wozu überhaupt Regex?

Entweder ich verstehe Dein Problem nicht so ganz oder es ist wirklich so einfach ... den Index oben auslesen und merken, evtl. ein Dictionary<string, bool> und dann über den Rest der Datei gehen ...

14.02.2011 - 13:49 Uhr

Hi zommi,

hat bisschen gedauert bis ichs verstanden hab, aber Deine Lösung hat mich überzeugt. Habs jetzt für mich mal so gemacht:


    public class ZuendKerze { }

    public class Turbo { }

    public abstract class Motor
    {
        public int Leistung { get; set; }
    }

    public class BenzinMotor : Motor
    {
        public ZuendKerze Zk { get; set; }
    }

    public class DieselMotor : Motor
    {
        public Turbo Turbo { get; set; }
    }

    public class Auto<T> where T : Motor
    {
        protected T _motor;

        public Auto(T motor)
        {
            _motor = motor;
        }

        public T Motor { get { return _motor; } }
    }

    public class Benziner : Auto<BenzinMotor>
    {
        public Benziner(BenzinMotor motor)
            : base(motor)
        {
        }
    }

    public class Diesel : Auto<DieselMotor>
    {
        public Diesel(DieselMotor motor)
            : base(motor)
        {
        }
    }

Damit geht auch das, was ich dem new-Ansatz erreichen wollte:


Benziner benziner = new Benziner(new BenzinMotor());

ZuendKerze zk = benziner.Motor.Zk;

12.02.2011 - 18:33 Uhr

Ihr habt natürlich Recht, Diesel und Benziner müssen von Auto erben ... Danke für die Korrektur.

12.02.2011 - 08:39 Uhr

Danke für Eure antworten.

@MarsStein

Den anderen Beitrag hatte ich schon gelesen, der betrifftbaber ein anderes Problem

Genau die zusätzlich Property versuch ich mit diesem Ansatz zu vermeiden. Und zwei Properties die das selbe Objekt zurück liefern überzeugt mich nicht so ganz.


void TueIrgendwas(Diesel diesel)
{
   Turbo t = diesel.Motor.Turbo;
}

void TueIrgendwas(Diesel diesel)
{
   Turbo t = ((DieselMotor) diesel.Motor).Turbo;
}

@hebivore

Der Meinung bin im Prinzip schon auch, mir ging es nur diesen wie Du sagt sehr speziellen Fall.
Wenn einer der von Dir genannten Punkte nicht zutreffen würde, würde das in der Tat sehr fragwürdig sein. Wurde dieser Fall schon mal diskutiert? Konnte mit der Suche nichts finden.

11.02.2011 - 23:29 Uhr

Hallo zusammen,

Ich hab mit nem Kollegen über die Verwendung des new Keywords zum verdecken von Methoden / Properties diskutiert, er ist der Meinung new sei von Grund auf schlechter Stil und sollte nie verwendet werden. Jetzt würde ich gern Eure Meinung zu folgendem Beispiel hören:


abstract class Motor
{
   public int Leistung { get; }
}

class BenzinMotor : Motor
{
   public ZuendKerze ZK { get; }
}

class DieselMotor : Motor
{
   public Turbo Turbo { get; }
}

class Auto
{
   protected Motor _motor;
   public Motor Motor { get { return _motor;}}
}

class Benziner : Auto
{
   public Benziner(BenzinMotor motor)
   {
      _motor = motor;
   }

   public new BenzinMotor Motor
   {
      get { return _motor as BenzinMotor;}
   }
}

class Diesel : Auto
{
   public Diesel(DieselMotor motor)
   {
      _motor = motor;
   }

   public new DieselMotor Motor
   {
      get { return _motor as DieselMotor;}
   }
}


Meine Idee hier ist, durch das Verdecken der allgemeinen Property der Basisklasse gleich die gecastete spezialsierte Property anzubieten.
Gibt es irgendwelche Prinzipen, die dagegen sprechen? Irgeneinen Nchteil / Nogo das ich übersehe?

30.09.2010 - 20:03 Uhr

Ich hatte heute einen Termin mit einem Entwickler, der in seiner Software Liniendiagramme in "Echtzeit" anzeigt (eigentlich gings um was ganz anders), es handelt sich allerdings um ein .NET Forms-Control, das er selbst entwickelt hat. Er hat sich entschlossen das Control selbst zu entwickeln, nachdem er mit zugekauften Controls nie zufrieden war.

Ich hab das Gefühl, die ganzen Charting-Libs zielen eher auf Business-Anwendungen ab, in denen statische Daten angezeigt werden oder die Daten sich nur langsam ändern (z.B. Finanzbranche) ... für Anwendungen im Messtechnik-Bereich wo man eine Art Oszilloskop-Darstellung benötigt haben diese Bibliotheken zu viel Overhead.

28.09.2010 - 23:36 Uhr

Ich finde Caliburn Micro auch sehr gut, hatte bisher alles was ich brauch und ist es ist trotzdem sehr schlank. Ich hab's gern wenn ich noch verstehe, was das Framework das ich einsetzte im Hintergrund macht.

28.09.2010 - 23:30 Uhr

Wir haben bei uns die telerik controls im Einsatz, wobei ich mich nur mit der Charting-Lib beschäftigt habe. Vom Support her sind die ganz gut, man kriegt relativ schnell ne Antwort und es gibt auch regelmäßig Updates. Das datagrid setzt ein Kollege von mir ein, er ist davon recht begeistert.

28.09.2010 - 23:25 Uhr

Hi,

Ich steh momentan vor dem gleichen Problem, habe mir auch schon ein paar Charting Libs angeschaut aber noch keine Performance Tests gemacht.

Was Du Dir anschauen könntest:

DataChart von Infragistics ... Die werben mit hoher Refreshrate

Radchart von Telerik ... Hab wir in der Firma im Einsatz, ganz ok eigentlich, ich glaub die sampeln die Daten automatisch runter

DynamicDataDisplay auf Codeplex ... Sehr Performant

Würd mich freuen wenn Du über Deine Erfahrungen berichtest ...

Gruß Mathias

26.12.2009 - 12:11 Uhr

So habs hinbekommen:


                DragBehaviour.SetIsDragEnabled(frameworkElement, true);

                Binding bindingX = new Binding();
                bindingX.Path = new PropertyPath( Canvas.LeftProperty);
                bindingX.RelativeSource = RelativeSource.Self;
                frameworkElement.SetBinding(DragBehaviour.XProperty, bindingX);
                
                Binding bindingY = new Binding();
                bindingY.Path = new PropertyPath(Canvas.TopProperty);
                bindingY.RelativeSource = RelativeSource.Self;
                bindingY.Mode = BindingMode.TwoWay;
                frameworkElement.SetBinding(DragBehaviour.YProperty, bindingY);

26.12.2009 - 12:03 Uhr

Hast natürlich Recht, diese Funktion gibt es 😉

In die Doku hab ich schon geschaut, ich komm nur mit der Kombination Attached Property und Binding nicht klar. Ich werd mal weiter suchen ... danke für Deine Hilfe 😉

26.12.2009 - 11:34 Uhr

Hmm da es ein normales Control handel gibts keine Funktion SetIsDragEnabled.

Hier noch die Info ausm Ausgabe-Fenster:

System.Windows.Data Error: 39 : BindingExpression path error: 'Canvas' property not found on 'object' ''Button' (Name='')'. BindingExpression:Path=Canvas.Left; DataItem='Button' (Name=''); target element is 'Button' (Name=''); target property is 'X' (type 'Double')
System.Windows.Data Error: 39 : BindingExpression path error: 'Canvas' property not found on 'object' ''Button' (Name='')'. BindingExpression:Path=Canvas.Top; DataItem='Button' (Name=''); target element is 'Button' (Name=''); target property is 'Y' (type 'Double')

26.12.2009 - 10:56 Uhr

frameworkElement sollte eigentlich ein beliebiges Control sein ...

25.12.2009 - 22:09 Uhr

Hallo,

ich verwende eine Assembly, mit der man Controls verschieben kann. http://wpfextensions.codeplex.com/

Dies funktioniert mit Attached-Properties, hier die XAML-Version:

          <Label extbehaviour:DragBehaviour.IsDragEnabled="True" 
               extbehaviour:DragBehaviour.X="{Binding RelativeSource={RelativeSource self},Path=(Canvas.Left) ,Mode=TwoWay}"
               extbehaviour:DragBehaviour.Y="{Binding RelativeSource={RelativeSource self},Path=(Canvas.Top),Mode=TwoWay}" Content="Test" />
    

Genau das Selbe würd ich jetzt gern per Code machen, kriege es aber nicht hin.
Mein bisheriger Versuch sieht so aus:

    frameworkElement.SetValue(DragBehaviour.IsDragEnabledProperty, true);

    Binding bindingX = new Binding("Canvas.Left");
    bindingX.RelativeSource= RelativeSource.Self;
    bindingX.Mode = BindingMode.TwoWay;
    frameworkElement.SetBinding( DragBehaviour.XProperty,bindingX );

    Binding bindingY = new Binding("Canvas.Top");
    bindingY.RelativeSource = RelativeSource.Self;
    bindingY.Mode = BindingMode.TwoWay;
    frameworkElement.SetBinding(DragBehaviour.YProperty, bindingY);

Kann mit jemand sagen, wo mein Fehler liegt?

24.12.2009 - 16:33 Uhr

Hallo zusammen,

ich sitze gerade vor einem Problem, vielleicht hat ja hier jemand ne Lösung:

Ich habe eine Klasse, auf deren Elemente ich per Indexer zugreife:


public class SignalManager: INotifyPropertyChanged  
{
        [IndexerName("Item")]
        public double this[string signalPath]
        {
            get
            {
                return GetSignalValue(signalPath);
            }
        }
...
...
}

In meiner WPF-GUI binde ich diese Werte an Steuerelemente:


<ProgressBar Value="{Binding Path=SignalManager[MFG\\MF_Data], Mode=OneWay}" Height="27" HorizontalAlignment="Right" Margin="0,69,12,0" Name="progressBar1" VerticalAlignment="Top" Width="224" Maximum="255" />

Wenn sich nun in der Klasse ein Wert ändert, setzte ich ein PropertyChanged-Event ab:

OnPropertyChanged("Item[]");

Soweit funktioniert das auch, das Problem dabei ist, dass alle Bindings (also alle Indizes) aktualisiert werden, also auch die, bei denen sich nichts geändert hat.

Ist es möglich, ein Event auszulösen, damit nur ein bestimmter Wert aktualisert wird? Hoffe meine Formulierung ist halbwegs verständlich.

Vielen Dank im Voraus und frohe Weihnachten 😃

17.09.2009 - 13:16 Uhr

Ah OK,

so isses natürlich vernünftig. Stand heut morgen noch aufm Schlauch.

Danke 👍

17.09.2009 - 10:38 Uhr

Hier findest Du eine Liste mit allen Math-Methoden, es sind alle dabei, nach denen Du gefragt hast 😉

Math Methods

17.09.2009 - 10:22 Uhr

Danke für Deine Antwort.

zu 3):

Meinst Du das ungefähr so?


public interface DriverInterface
{
    ComDriver GetComDriver();
    bool GetData();
}

Sah auf den ersten Blick für mich auch wie die beste Lösung aus ... dann müsste ich in Device dieses Interface doch public implementieren und man hätte wieder von außen Zugriff auf den ComDriver.

16.09.2009 - 23:13 Uhr

Hallo zusammen,

ich sitz gerade an einem Problem, bei dem mir keine richtige Lösung einfällt.

Eine Klasse Device enthält mehrere Instanzen der Klasse Channel.
Die Klasse Device kommuniziert über eine Instanz der Klasse ComDriver mit einer externen Hardware, die Channel-Instanzen sollen auch ComDriver kommunizieren können.

Meine erste Idee war, einfach eine Referenz von ComDriver an Channel zu übergeben. Ich hatte aber vergessen, dass ich auch auf eine Property der Klasse Device Zugriff benötige.

Eine andere Möglichkeit wäre dann, eine Referenz auf Device zu übergeben. Dann müsste aber der ComDriver public sein, was ich eigentlich nicht will.

Die nächste Idee wäre dann, Referenzen auf Device und ComDriver zu übergeben, aber irgendwie bin ich auch nicht zufrieden damit.

Ich hab hier einen vereinfachten Beispielcode, vielleicht hat jemand Tipps für mich, wie ich das Problem besser lösen kann.




    public class Device
    {
        public bool Data
        {
            get;
            set;
        }

        private ComDriver communicationDriver;

        private List<Channel> channels = new List<Channel>();

        public List<Channel> Channels
        {
            get
            {
                return channels;
            }
        }

        public Device()
        {
            communicationDriver = new ComDriver();

            for (byte i = 0; i < 8; i++)
            {
                channels.Add(new Channel(communicationDriver)); // Möglichkeit 1
                channels.Add(new Channel(this)); // Möglichkeit 2
                channels.Add(new Channel(this, communicationDriver)); // Möglichkeit 3
            }
        }
    }



    /* hier kein Zugriff auf die Data-Property */
    public class Channel
    {
        private ComDriver communicationDriver;

        public Channel(ComDriver driver) 
        {
            communicationDriver = driver;
        }

        public void DoSomething()
        {
            if (Data)
            {
                communicationDriver.DoSomething();
            }
        }
    }


    /* hier müsste der ComDriver der Klasse Device public sein */
    public class Channel
    {
        private Device deviceRef;

        public Channel(Device device)
        {
            deviceRef = device;
        }

        public void DoSomething()
        {
            if (Device.Data)
            {
                device.CommunicationDriver.DoSomething();
            }
        }
    }


    /* ist das eine saubere Lösung? */
    public class Channel
    {
        private Device deviceRef;
        private ComDriver communicationDriver;

        public Channel(Device device, ComDriver driver)
        {
            deviceRef = device;
            communicationDriver = driver;
        }

        public void DoSomething()
        {
            if (Device.Data)
            {
                communicationDriver.DoSomething();
            }
        }
    }