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?
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?
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?
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.
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.
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?
Mal ne andere Frage, du sagst es gehen die Umlaute verloren, gehen die wirklich schon beim Serialisieren verloren, oder erst beim lesen?
Stimmt, aber ich nenne ich trotzdem manchmal so 😃
Korrekterweise sollte man aber Lambda Operator dazu sagen.
Siehe dazu die MSDN. Den Filestream kann man ein Encoding mitgeben.
Oder wolltest du wissen wie man den Operator => nennt?
Ich nenne den Queryoperator bzw Lambdaoperator.
Hallo caldicot,
schau dir mal die das System.Text.Encoding Enum an. M. E. müsste UTF-8 -Encoding Umlaute behandeln.
Das würde mich aber wundern, das sich das Image ändert wenn der Button disabled wird! Ich schau mal in die MSDN.
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.
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.
Ja das war ein Kopier Fehler. Die xml ist valide. Daran liegt es nicht, dient nur als Beispiel.
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.
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
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.
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
Nur mal so am Rande. Für welchen UseCase brauchst du ein Fenster in der Größe 1x1?
Das "return 0" kannst du dir sparen.
Nein kann er nicht, da die Mehtoden Signatur wie folgt lautet.
public static int Main(string[] args)
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.
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.
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.
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.
Jepp, genau so ist es. Allerdings finde ich immer noch das die generische Klasse an der Stelle auch greift.
Sehr gut zusammen gefasst Zoomi.
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.
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
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.
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)
{
}
}
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!
Hallo jowa,
schau dir mal die TimeSpan Struct an.
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...
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.
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.
Doch
Delegate testDelegate; // Irgend eine Methode ist darin referenziert.
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?
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.
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
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.
Die Antwort wurde dir bereits gegeben.
Schnellersetzung (STRG + H)
Das ist relativ klar. Caste mal eins der inneren objekte auf object[] dann kannst du das auch via indexer ansprechen!
Wie gesagt
Weil ich bin leider auf diese Version angewiesen!
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.
Der Action delegate ist der schon seit .NET 2.0 drin? Weil ich bin leider auf diese Version angewiesen!
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!)
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.
Hallo Lesat,
mein Tip zeichne das Schachbrett selber, und auch die Figuren. Das ist ertsens wesentlich performanter, und zweitens bist du so flexibler.