Laden...
Avatar #avatar-3271.jpg
rollerfreak2 myCSharp.de - Member
Software Architekt Dabei seit 14.07.2008 916 Beiträge
Benutzerbeschreibung
Man lernt nie aus...

Forenbeiträge von rollerfreak2 Ingesamt 916 Beiträge

17.11.2010 - 19:40 Uhr

Hallo herbivore,

ich finde das überhaupt nicht offensichtlich. Desweiteren "denke" ich das ich falsch verstanden wurde.

wenn man in einem Vorgang eine bestimmte Zeitspanne warten will, den Vorgang aber auch während dieser Zeitspanne abbrechen können will...

Das Wort während ist falsch, es ist zu jedem Zeitpunkt der Ausführung möglich die GetModi Mehtode abzubrechen. Ich glaube unten stehendes Diagramm verdeutlicht das was ich erreichen will etwas. Nehmen wir mal nur die Sync methode, diese kann auch nicht abgebrochen werden! Den Aufruf der GetModi sync findet im GUI Thread statt. Laut deiner Aussage ist das pollen dort nicht mehr notwendig wenn man die Denkweise umdreht.

den Vorgang aber auch während dieser Zeitspanne abbrechen können will, bietet es sich an, die Sache gedanklich umzudrehen, also vorrangig auf den Abbruch zu warten, aber das maximal eine bestimmte Zeitspanne lang, sprich z.B. einen AutoResetEvent mit TimeOut zu verwenden. Damit vermeidet man jede Art von Polling

Leider hab ich keinen Plan wie das gehen soll, wenn man in der im Diagramm dargestellten Methode eine Pause machen soll, ohne zu pollen?

17.11.2010 - 14:17 Uhr

Okay das mit dem abbrechen das habe ich verstanden. Wie aber soll ich damit die "Pause" erreichen? Kannst du das bitte noch mal ein bisschen genauer Erklären?

17.11.2010 - 13:00 Uhr

welche .net-Version verwendest du?

Wir sind leider auf 2.0 beschränkt! Das von herbivore vorgeschlagene klingt zwar gut, löst aber das Problem des Wartens nicht, oder ich hab es nicht richtig verstanden. Also die Methode GetModi soll zu jeder Zeit abbrechenbar sein! Desweiteren soll die Methode an einer bestimmten Stelle im Code eine bestimmte Zeit warten, ohne jedoch die Methode zu verlassen.

Das mit dem AutoResetEvent schau ich mir mal an. Wer raised das denn, und wie beende ich dann die Methode? Und was hat das mit der von mir erwähnten Pause zu gemeinsam?

17.11.2010 - 09:30 Uhr

Alternative zu Thread.Sleep ist ein Timer.

Die 2 Vorschläge habe oben schon aufgeführt. Nur welcher ist besser?

Wie bekommt die GetModi-Methode den Wert für die Pause mitgeteilt?

Die GetModi Methode berechnet die Pause anhand von Daten die es im GetModi von der Peripherie bekommt.

Auch wenn es Vorgabe ist das synchron aufzurufen kann die Ausfürhung nebenläufig erfolgen.

Ich denke das geht nicht, weil den Aufruf kann ich nicht beeinflussen. Daher derjenige der mich ruft erwartet das Ergebnis im Return Value der Methode. Daran kann man leider nix Ändern, sprich über ein Event synchronisieren ist leider nicht möglich.

17.11.2010 - 07:40 Uhr

Hallo,

Wie wird übrigens die Pause berechnet?

Das ist von einigen Dingen der Peripherie abhängig, das kann/darf ich hier nicht genauer erklären. Wichtig ist, im normal falle sind die Interrupts/pausen im Millisekunden Bereich, 300-800ms. Von daher friert die GUI nicht gleich ein.

Die UI sollte nie warten, denn sonst friert sie ein.

Da hast du eigentlich recht, nur folgende Randbedingung sind einzuhalten. Die Methode integriert sich in ein Framework welches die Methode auch synchron aufruft, daher erwartest es auch das Ergebnis synchron. Dem entsprechend kann ich dort den Aufruf leider nicht beeinflussen.

16.11.2010 - 23:46 Uhr

Hallo zusammen, ich beschreibe erstmal die Randbedingungen. Eine Methode berechnet einen Modus an einer verbunden Peripherie. Diese Berechnung erfordert eine "Pause" die dynamisch ist, daher berechnet wird. Sprich die Methode fragt einige Dinge an, muss dann kurz pausieren (das kann man leider nicht Ändern, das ist ein MUSS), und fragt dann noch ein paar dinge ab. Anschließend hat die Methode alle nötigen Daten um den Modus zu berechnen.

Die Methode hängt an einem Service welcher im GUI Thread erzeugt wurde. Nun gibt es 2 Möglichkeiten den Modus anzufragen. Zum einen Synchron, daher direkt. Zum anderen asynchron, daher im Service selber wird die Methode in einem separaten Thread ausgeführt. Ist der Thread beendet, wird dem Caller der Asynchronen Methode via Callback bescheid gegeben, das dass Ergebnis des Modus nun vorliegt.

Wird die Async Methode ausgeführt, so gibt es noch die Möglichkeit den Berechnung abzubrechen. Dazu wird einfach eine boolsche Variable gesetzt, welche im Thread immer wieder abgefragt wird, und im falle diese ist true, wird via return die Methode die dem Thread zugeteilt ist verlassen und damit die Berechnung beendet.

Mir geht es jetzt um das Design des Interrupts. Klingt vielleicht einfach, jedoch gibt es da wie immer mehrere Ansätze. Mir fallen Spontan 3 Stück ein. Die GetModi Methode liefert den Modus. Diese kann entweder direkt gerufen werden, oder über einen separaten Thread. Daher muss die GetModi() Methode immer wieder das oben genannte bool abfragen (volatile aborted).


Modi GetModi()
{
    ....
    if (aborted) return Modi.Aborted;
    ....
    if (aborted) return Modi.Aborted;
    ....
    //here we need the timer interrupt for example 4000 ms
    //we could not ask for the aborted flag during the interrupt
    Thread.Sleep(4000);
    ....
    if (aborted) return Modi.Aborted;
    ....
}


Modi GetModi()
{
    ....
    if (aborted) return Modi.Aborted;
    ....
    if (aborted) return Modi.Aborted;
    ....
    //here we need the timer interrupt for example 4000 ms
    Timer t = new Timer(4000);
    this.m_interruptReached = false;
    t.Elapsed += this.Elapsed;
    t.Start();
    while (!this.m_interruptReached)
    {
        //polling... 
        if (aborted) return Modi.Aborted;
    }
    t.Stop();

    ....
    if (aborted) return Modi.Aborted;
    ....
}

void Elapsed(object sender, EventArgs args)
{
    this.m_interruptReached = true;
}


Modi GetModi()
{
    ....
    if (aborted) return Modi.Aborted;
    ....
    if (aborted) return Modi.Aborted;
    ....
    //here we need the timer interrupt for example 4000 ms
    //we could ask for the aborted flag between the time interrupt
    for (int i = 0; i < 8; ++i)
    {
        Thread.Sleep(500);
        if (aborted) return Modi.Aborted;
    }
    ....
    if (aborted) return Modi.Aborted;
    ....
}

Ich weis, Thread.Sleep ist nicht schön, jedoch hätte es den Vorteil, das während des Sleeps ein anderer Thread die CPU Power bekommt, das wäre im 2ten Beispiel nicht der Fall (Polling). Gibt es für solche UseCases ein Design Pattern, mir ist dafür leider keines bekannt. Was sagt Ihr dazu, wie würdet ihr das Designen mit den gegebenen Vorgaben?

10.11.2010 - 09:26 Uhr

Mal ne andere Frage, du sagst es gehen die Umlaute verloren, gehen die wirklich schon beim Serialisieren verloren, oder erst beim lesen?

10.11.2010 - 09:17 Uhr

Stimmt, aber ich nenne ich trotzdem manchmal so 😃

Korrekterweise sollte man aber Lambda Operator dazu sagen.

10.11.2010 - 09:13 Uhr

Siehe dazu die MSDN. Den Filestream kann man ein Encoding mitgeben.

10.11.2010 - 09:06 Uhr

Oder wolltest du wissen wie man den Operator => nennt?

Ich nenne den Queryoperator bzw Lambdaoperator.

10.11.2010 - 09:04 Uhr

Hallo ganymedes,

Stichwort LINQ.

10.11.2010 - 07:20 Uhr

Hallo caldicot,

schau dir mal die das System.Text.Encoding Enum an. M. E. müsste UTF-8 -Encoding Umlaute behandeln.

28.10.2010 - 12:02 Uhr

Das würde mich aber wundern, das sich das Image ändert wenn der Button disabled wird! Ich schau mal in die MSDN.

28.10.2010 - 09:38 Uhr

Da wird dir nix anderes übrig bleiben als das Image auszutauschen. Oder leite dich von Button ab, dann baust du dir einen Mechanismus, das du im Enable gleich false, das Image holst, dann ein GrayScale draus machst, und neu zuweist. Siehe dazu hier. Dann kannst du den Button einfach verwenden, und musst dich um nix mehr kümmern.

21.10.2010 - 15:09 Uhr

Okay das war ein ziemlich blöder versteckter Fehler. Das entsprechende Value wurde vom Serializer als Enum interpretiert. Das hatte zur Folge das ein Enum natürlich kein { und } haben darf. Deswegen kam auch immer das value ohne die { und } zurück.

Kann geschlossen werden.

21.10.2010 - 13:51 Uhr

Ja das war ein Kopier Fehler. Die xml ist valide. Daran liegt es nicht, dient nur als Beispiel.

21.10.2010 - 13:50 Uhr

Mit einem kleinen Test Programm habe ich es auch grad noch mal nach getestet. Dort funktioniert es auch ohne Probleme. Ich hab mir jetzt noch mal die originale XML angeschaut, die ist in UTF-8 ohne BOM codiert. Eventuell liegt da der Fehler.

21.10.2010 - 13:31 Uhr

Hallo zusammen,

folgendes Problem. Eine XML Datei enthält { und } in mehreren Attributen.


<Name>
<Id= name"ident{0}"/>
</Name>

Das komische ist nur das wenn ich mit einem UTF-8 Reader lese, werden die { und } nicht mit gelesen. Weis einer warum?

Edit: Kopier Fehler

21.10.2010 - 07:26 Uhr

Ich sehe Floste's Vorschlag Zielführend. Im Hintergrund der Trackbar einen Grünen Balken Zeichnen, der die Position anzeigt sodass die Summe 100 ergeben würde. Ist nicht weiter kompliziert und der User wird nicht irritiert wenn sich auf einmal die anderen Trackbars bewegen.

20.10.2010 - 13:33 Uhr

Ich versteh irgendwie das Problem nicht. Meiner Meinung nach ist die von gfoidl vorgeschlagene Lösung die beste. Definiere ein Interface, ein Modi Enum und dann jeweils eine konkrete Klasse zu jeweils einem Modi. Dann Erstell eine Factory Klasse die dann einen Modi entgegen nimmt, und eine Instanz zurück gibt die dem gegebenen Modus entspricht. Factory Pattern

16.10.2010 - 09:51 Uhr

Nur mal so am Rande. Für welchen UseCase brauchst du ein Fenster in der Größe 1x1?

12.10.2010 - 10:44 Uhr

Das "return 0" kannst du dir sparen.

Nein kann er nicht, da die Mehtoden Signatur wie folgt lautet.

public static int Main(string[] args)
12.10.2010 - 10:42 Uhr

Das Programm startet immer. Das ist nicht dein Problem. Dein Problem ist der Programmablauf. Das Programm macht genau das was du programmiert hast, nämlich die Main Methode betreten, Hallo Welt auf die Console schreiben, und dann die Main Methode wieder verlassen. Das verlassen der Main Methode hat zur Folge das auch die Console geschlossen wird. Wie n0TabR0 bereits geschrieben hat hilft dir ReadKey weiter.

Aber das sind wirklich absolute Grundlagen die schon unter 1.1 Wie poste ich richtig fallen.

11.10.2010 - 11:28 Uhr

Ich hab jetzt


GetExportedTypes()

gefunden und das scheint zu funktionieren. Denn die TestFixtures müssen ja alle nach außen sichtbar sein. Wenn jemand noch was besseres einfällt, immer her damit.

11.10.2010 - 11:18 Uhr

Hallo zusammen,

ich habe mehrere NUnit Test Assemblies. Aus diesem möchte ich gern alle TextFixture's extrahieren. Dieses mache ich derzeit wie folgt.


Assembly assembly = Assembly.LoadFile(pathAssembly);
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
    object[] attrbiutes = type.GetCustomAttributes(true);
    foreach (object attribute in attrbiutes)
    {
        if (attribute.GetType() == typeof(TestFixtureAttribute))
        {
            testFixtures.Add(type.FullName);
            break;
        }
    }
}

Jedoch bekomme ich eine Exception bei manchen NUnit Tests bei


assembly.GetTypes();

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Dies Typen sind in anderen Assemblies definiert. Diese liegen aber parallel zu der Test Assembly. Diese sollten also geladen werden können!

Gibt es noch eine andere Möglichkeit alle TextFixtures eines NUnit Tests zu extrahieren, ohne die Assembly zu laden, bzw. wie kann ich beim laden der Assembly alle Dependecies auf einen Pfad verlinken.

07.10.2010 - 12:39 Uhr

Wenn du an den neu Hinzugefügten Nodes ein select mit der alten Node machst, dann ist doch logisch dass das nicht geht. Du brauchst einen ident, weil die neu erzeugte Node hat doch einen anderen HashCode als die alte. Also musst du dir an deine TreeNode ne Art Id bauen, z.B. an das Tag Property. Und beim selektieren, alle Nodes durch laufen, und schauen ob eine dabei ist die die gleiche Id hat.

05.10.2010 - 20:43 Uhr

Jepp, genau so ist es. Allerdings finde ich immer noch das die generische Klasse an der Stelle auch greift.

05.10.2010 - 14:46 Uhr

Wenn jede abgeleitete Klasse ein spezifisches Objekt braucht, warum gibts die Methode dann in der Basisklasse?

Es dient nur dafür das eine gewisse Structure eingehalten wird. Klar ich könnte auch ein Interface Implementieren für diese Init Methode, oder gar kein Interface und die Init einfach public in jede Klasse schreiben, aber ob das besser ist sein mal da hin gestellt.

Was würde deiner Meinung nach passieren, wenn du...

Das würde ja nicht gehen, denn MyDerived1 sollte nur Bar's initialisieren können. Wobei wir wieder beim Thema der generischen Klasse wären, den wenn die Klasse den Typ einschränkt macht das schon wieder Sinn.

05.10.2010 - 14:09 Uhr

Genau die Syntax habe ich gesucht. Jetzt stellt sich also nur noch die Frage was nun besser geeignet ist. Die Klasse selbst hält dieses T nicht, im Init wird das Object nur genommen um einige Services zu laden, es wird nicht gespeichert.

Daher Klasse generisch oder Methode generisch?


public class MyClass1 
{
    public void virtual Init<T>(T parameter) 
    {

    }
}

public class MyClass2 : MyClass1
{
   public override void Init<T>(T data)
   {
        //wie kann ich hier das T einschränken?
   }
}


public override void InitStructure<T>(T data) where T : object
//das geht nicht

public override void InitStructure<int>(int data)
//das geht auch nicht

05.10.2010 - 13:41 Uhr

Mir ist klar das es auf die weise funktioniert wie Lector es beschrieben hat. Ich dachte man kann eine Methode einer Klasse generisch machen, ohne die Klasse generisch zu definieren. Weil das in meinem UseCase gereicht hätte. Aber nach genaueren drüber nachdenken ist das eigentlich schon richtig so. Weil die Init Methode initialisiert die Klasse mit einem Bestimmten Typ. Also sollte die Klasse auf den Typ beschränkt sein und damit generisch definiert werden.

Danke für die schnellen Antworten.

05.10.2010 - 12:55 Uhr

Hallo zusammen,

ich steh grad ein bisschen auf dem Schlauch. Ich hab eine Basis Klasse die mehrere virtual Methoden hat. Unter anderem eine void Init(object data). Nun erben mehrere Klassen diese Klasse und implementieren natürlich auch die Init Methode. Nun ist aber in den Unterklassen das object genauer spezifizierbar, daher dort sollte nicht object data zugelassen werden, sondern ein spezieller Type.

Kann ich die Init Methode der Basisklasse den Typ "data"(object) generisch angeben, ohne die ganze Basisklasse generisch machen zu müssen? Oder muss die ganze Basisklasse generisch definiert werden und in den unterklassen mit where T ... eingeschränkt werden?


public class Test<T>
{
    public virtual Init(T data)
    {

    }
}

01.10.2010 - 08:23 Uhr

Ja das ist auch ziemlich logisch. Weil du garantiert auf den falsche Objecttype zugreifst. Daher mach mal folgendes.


if  (einsatzAuswahl.Count != 0)
{
    object obj = einsatzAuswahl[0];
}

Das muss zu 100,00 Prozent funktionieren!

30.09.2010 - 08:51 Uhr

Hallo jowa,

schau dir mal die TimeSpan Struct an.

30.09.2010 - 07:52 Uhr

Hallo,

du solltest wie MarsStein bereits erwähnt hat dir 'noch' mal die Grundlagen anschauen. Für solche einfach selber zu lösenden Probleme ist diese Forum eigentlich nicht gedacht...

29.09.2010 - 12:23 Uhr

ein bool sollte mit volatile versehen werden

Jepp das wurde bereits getan, nur ging die Diskussion wegen dem Lock los.
Danke für die schnelle Info. Ich glaub jede simple lese sowie schreibaktion eines Feldes kleiner oder gleich 32 Bit ist atomar.

29.09.2010 - 12:14 Uhr

Hallo zusammen,

wir haben grad eine Diskussion bezüglich des locken's von Operationen. Daher muss man in einem Thread das setzen und lesen eines bool mit lock absicher? Ich dachte immer atomare Operationen muss man nicht locken, jetzt stellt sich natürlich die Frage ob das setzen bzw. lesen eines bools in c# eine atomare Operation ist.

28.09.2010 - 12:06 Uhr

Doch


Delegate testDelegate; // Irgend eine Methode ist darin referenziert.

28.09.2010 - 10:38 Uhr

Hallo zusammen,

ich habe ein Problem beim laden einer PDB. Und zwar möchte ich folgendes machen. Wir haben pdb files in denen die source files drin stehen, diese aber auf der Maschine wo die gebaut worden liegen. Wir haben die source files local kopiert, jedoch passen die dann zur Laufzeit nicht mehr zu dem Pfad. Was wir also möchten ist folgendes.

Ich möchte die PDB's auslesen, und dort dann die Pfade auf die Sourcen ändern, daher die Filenamen bleiben erhalten, jedoch nicht die Pfade. Jetzt wollt ich mir einen ISymbolReader holen und als input das pdb File geben. Jedoch bekomm ich da immer die Exception dass das File corrupt: HRESULT: 0x8013110E. Das heißt ich muss immer den Reader für die dazu liegende Assembly laden.
Das Problem ist das die nicht paralell liegen. Warum kann ich keinen Reader nur für das PDB laden? Ist mein Vorhaben überhaupt so realisierbar?

27.09.2010 - 16:55 Uhr

Ergänzung zu gfoidl, auf dem Zeilrechner muss mindestens die Version installiert sein, die für die Assembly erforderlich ist. Daher eine mit einem .net 2.0 Compiler kompilierte Assembly muss mit einer .net 4.0 Runtime laufen.

27.09.2010 - 14:27 Uhr

Ja also wie bereits von Jack mehrmals geschrieben.

* Nimm als Input die csproj Datei
* Diese kannst du parsen und dir eine Liste mit c# Dateien machen
* Dann iterierst du über alle c# Dateien und öffnest diese mit einem Reader
* Nun einen passenden Regex nehmen, und alle Matches in die Resource schreiben und dort dann ersetzen, oder mit der von Jack vorgeschlagenen Extension Method
* Änderungen speichern

27.09.2010 - 14:02 Uhr

Das mit dem Thread ist eine gute Idee. Ich hätte noch eine andere, bist du dir sicher das du alle Control aufrufe Synchronisiert hast, daher mit Invoke aus dem GUI Thread heraus ausgeführt hast?

Desweiteren würde ich mal ein paar logs einbauen. Sprich immer beim tick event den Zeitstempel in eine log schreiben, und auch beim starten und beenden des Threads die Zeiten loggen. Eventuell siehst du dann schon die Überschneidungen auf die JuyJuka hingewiesen hat.

27.09.2010 - 11:21 Uhr

Die Antwort wurde dir bereits gegeben.

Schnellersetzung (STRG + H)

26.09.2010 - 11:30 Uhr

Das ist relativ klar. Caste mal eins der inneren objekte auf object[] dann kannst du das auch via indexer ansprechen!

24.09.2010 - 20:10 Uhr

Wie gesagt

Weil ich bin leider auf diese Version angewiesen!

24.09.2010 - 09:27 Uhr

Ich steh grad bisschen auf den Schlauch. Meinst du soll dann das delegate so definieren?


object ExampleDelegate(object param1, object param2);

Desweiteren müsste ich für Properties ersteinmal eine extra Methode anlegen, die dann via delegate invoked werden kann. Oder kann ich Properties auch per delegate invoken, hab dazu bis jetzt noch nichts gefunden.

23.09.2010 - 20:59 Uhr

Der Action delegate ist der schon seit .NET 2.0 drin? Weil ich bin leider auf diese Version angewiesen!

23.09.2010 - 11:31 Uhr

Hallo herbivore,

Davon abgesehen hat InvokeRequired in der Berechungsmethode einer (Modell)-Klasse auf keinen Fall etwas zu suchen.

Das ist ein eigener ThreadSynchronizer. Der hat nix mehr der GUI zu tun, sondern mit der eigenen Persitenz. Mit generisch meine ich eigentlich nur das Invoken aller _verschiedener _ MethodenSiganturen/Properties ohne für jede ein eigenes Delgate anzlegen.

Könntest du die Berechnung nicht einfach immer im Thread ausführen lassen

Nein das kann ich nicht, wie ich bereits geschrieben habe

(Warum das so ist sei mal dahin gestellt!)

23.09.2010 - 10:48 Uhr

Hallo zusammen,

ich suche derzeit nach einer schönen generischen Lösung für folgendes Problem. In einer klasse gibt es eine Methode die etwas berechnen soll. Diese greift Ihrerseits wieder auf andere Methoden andere Klassen/Object zu, entweder über Properties oder über Methoden.
Nun gibt es zwei möglichkeiten diese "Brechnungsmethode" aufzurufen. Einmal direkt, und einmal in einem separaten Thread. (Warum das so ist sei mal dahin gestellt!)

Nun müssen alle aufrufe die innerhalb der "Brechnungsmethode" aufgerufen werden synchronisiert werden, zumindets diejenigen die andere Klassen aufrufen (wenn die "Brechnungsmethode" in einem separaten Thread läuft). Nun hab ich keine Lust für alle diese aufrufe ein delegate zu definieren, und jedesmal zu schauen ob Invoke required ist.

Kennt jemand diesen UseCase bzw. hat einer eine Idee wie man sowas generisch lösen kann?

Ich hoffe ich konnte das Problem verständlich erläutern.

21.09.2010 - 16:19 Uhr

Hallo Lesat,

mein Tip zeichne das Schachbrett selber, und auch die Figuren. Das ist ertsens wesentlich performanter, und zweitens bist du so flexibler.