Grüss euch,
Ich fang mal so an
Aufbau des Fensters:
eine System.Windows.Forms Form
darauf im Designer
Ein "Kompatibilitäts-Control"
positioniert
Zur Laufzeit wird
Ein von Canvas abgeleitetes Object (MainFrame)
als Child hineingehängt.
im ctor von MainFrame wird
Ein von Canvas abgeleitetes Object (LineContainer)
erstellt und mit Children.Add() angefügt (ZOrder wird auch vergeben)
Bevor der LineContainer mit Add() angefügt wird, wird
Ein Line-Object (nicht abgeleitet)
mit Children.Add() in den LineContainer gehängt
und nun bräuchte ich vom LineContainer das MouseMove und DoubleClick-Event
Blöderweise, wenn ich die Events anzapfe, reagiert niemand darauf.
Ich kann vom MainFrame die Events anzapfen, da kommt dann auch wie erwartet jedes Event daher gebubbelt.
Bei den EventArgs in den jeweiligen Methoden gibt es ein SourceObject (o.ä.) welches das Object beinhaltet welches das Event geworfen hat.
Eigenartiger weise kommt da nie das LineContainer-Objekt vor, sondern bestenfalls das Line-Objekt.
Ich hab dann aus diesen Event eine Zeitlang herumprobiert, ob ich von diesem Event aus auf das aktuelle LineContainer-Objekt komme (es gibt mehrere davon)
So wie sich mir das Bild darstellt, wird das LineContainer nicht angezeigt, sprich ist nicht mit GUI-Mitteln nicht zu erreichen.
Da gäbe es auch die statische Mouse-Klasse, die einige Möglichkeiten bietet, aber selbst mit der habe ich es nicht erreicht irgendeinen LineContainer "gezielt" auswählen zu können.
Direkt Properties habe ich nicht gesetzt, sprich ist eigentlich alles Standard.
Was muss ich verstellen, damit auch mein LineContainer Events bekommt?
Anmerkung am Rande:
wenn Du Locking einbaust, brauchst Du auch unbedingt VersionHandling.
Was nützt es wenn du den gleichzeitigen zugriff verhinderst, wenn man auf einer alten Version des Datensatzen speichern darf?
Hi Spike24,
Wird allerhöchste Zeit sich in das Thema einzuarbeiten (-;
jep
Wir das Locking bei euch nur im Speicher gehalten oder habt ihr in der DB noch ein Hinweis auf den gelockten Datensatz?
nur im Speicher, wenn der LockingService stirbt, darf er keine Spuren hinterlassen
Ist der Service als Singleton implementiert?
Singelton, wobei die Frage nicht ganz verstehe, einen Service gibt es generell nur einmal, egal wieviele Verbindungen vom Client geöffnet werden
In was für einem Szeanrio setzt ihr euren Service ein?
Web- oder Windows-Client.
bei uns in Windows, wobei ich hier ebenfalls die Frage nicht ganz verstehe, den einem Service ist es ziemlich egal wer darauf zugreift.
Hab gehört der CommandBuilder ist manchen Szenarien nicht so performant.
Irrelevant.
Ohne Deinen Programmcode zu kennen verbratest Du an anderer Stelle das 100fache. Ohne es zu wissen. Versprochen.
Wenn das Programm von User 1 abstürzt hält User 1 das Lock auf den Datensatz bis in die nächste Ewigkeit, das kann unter Umständen dauern. Geht man nach Hollywood bis 2012 😉
Ausser Du hast ein "Programmteil" das dieses Lock nach z.b. 1 Minute entfernt. Aber nur wenn sich der Client nicht regelmässig meldet, es kann ja sein, das ein Client das Fenster nur offen hat, aber nicht ständig daran was ändert.
Grunsätzlich:
Um sowas zu implementieren, wirst Du Dein Framework mal aufbohren müssen.
Wenn Du Dich in http://www.mycsharp.de/wbb2/thread.php?threadid=32405 auskennst, wird Dir das ungemein helfen.
Als Erstes brauchst Du eine Stelle welche das locking übernimmt:
Wenn sich ein Client meldet locken, das regelmässige locken empfangen kann, falls kein regelmässiges locken mehr kommt, das lock entfernt, und das lock entfernt wenn es der Client nicht mehr braucht (nach dem Speichern)
Wir haben uns dafür einen Service geschrieben mit den Methoden Acquire und Release
Der Client erzeugt einmalig einen SessionToken (UserName?) und übergibt bei Acquire diesen Token, den Typ des zu sperrenden Objects und die entsprechende Id.
Bei Release das gleiche.
Hint:
im LockingService haben wir ein Dictionary<DtoReference, SessionToken> wo gemerkt wird wer was gelockt hat und ein zweites Dictionary vom Type Dictionary<SessionToken, DateTime>
DtoReference.Properties = Type und Id, des Objektes.
Der Rest ist dann eigentlich eine einfache Sache wenn man den oberen Link intus hat. vor dem Property ändern geht man zum LockingService und fragt nach ob man den Lock auf das Objekt bekommt, wenn ja, dann führt man die Änderung durch wenn nein wirft man eine StateChangingCanceledExcption.
Das war eigentlich der ganze Zauber.
Ich glaub da sind generell noch ein paar Fragen offen.
Sollen die Änderungen nicht überschrieben werden? oder soll der 2. Benutzer daran gehindert werden etwas an den Daten zu ändern?
Beachte, die Daten zu ändern sind im Zeitablauf vor dem Speichern
Wann soll wer informiert werden? was soll bei 6. passieren
button.FindForm();
wäre mein erster Versuch.
sonst hat jedes Control eine Parent Eigenschaft.
Kann sein dass ich da jetzt daneben liege, aber:
ich kompilere mit CodeDom zur Laufzeit code (string => dll)
und da musste ich dem CodeDom Compiler sagen das ich 3.5 haben will
vielleicht fehlt das da einfach auch.
so in der Nähe von CompilerVersion("3.5");
Der Link passt zwar nicht ganz zum Thema aber die angesprochene Zeile kommt vor.
CompilerVersion
Ich weis dass Du was anderes hast, aber vielleicht konnte ich eine Richtung vorgeben.
// Edit:
bei mir hatte er ohne der richtigen Compiler version nämlich genau probleme mit dem Lambda, ohne lambda gings auch ohne Compilerversion
Wenn es bei dir ohne Lambda geht, würde ich in die gleiche Richtung tippen.
ich guck im processexplorer nach wer ein handle auf diese datei hat
War eh nur als Schmäh gemeint, ich habe die "Aufgabe" ein Fenster nachzuzeichnen und da sind die Linien halt scharf.
Wenn man ein fancy Design braucht/will ist man mit dieser Eigenschaft vorn dabei!
ja wunderbar, so gefällt mir das.
Antialiasing, wer braucht denn sowas pfff 😉
und (vermute ich jetzt mal) mit deutlich weniger Overhead auskommt, was den Code der Controls selbst angeht.
wir verwenden StandardControls, das war unsere Vorgabe.
Das System 1:1 übernehmen geht schlecht, da Du ja andere Vorgaben hast, aber die Richtung würde ich beibehalten, um eben den Code in den Controls so gering wie möglich zu halten.
Eine grobe Ahnung von dem was rauskommen soll sollte schon vorhanden sein, oder glaubst du dem Computer alles. Zumindest für eine Plausibilitätsprüfung sollte das Ergebnis grob abgesteckt werden können. Wie sollst du sonst wissen ob das Ergebnis im zulässigen Bereich ist, etc.
Ok, ein bisschen übertrieben ausgedrückt, soviel weis ich schon damit ich die Sache überprüfen kann ob das stimmt was da rauskommt, klar.
Aber eben die mathematische Optimierung fehlt noch.
Ich habe eh in meinem Beitrag erwähnt das es zwei stellen gibt die eben zu überarbeiten sind.
Was noch zu bearbeiten ist, ist sicher die GetFittest() Methode. Die gibt mir noch viel zu viel zurück
Wie berechne ich die Fittnes?
von allen Populationen suche ich mir die raus, die am meisten dataRows hat. (z.b. 100)
...
Fürs testen, und weiter bin ich noch nicht, reicht es mir wenn nicht immer 0 (%) zurückkommt.
Hier sehe ich auch die Optimierung im Mathematischen Sinne zu erledigen, und die fehlt halt noch komplet. Ich programmiere mal den Alg. allgemein und diese Optimierunge nehme ich dann mit einem Freund vor, da er mehr Ahnung von diesem Thema hat.
Die Validierung haben wir absolut ident gelöst
ich habe ja in meinem Beitrag control.DataBinding... erwähnt.
da gibt es auch passende Events an die man sich hängen kann (BindingComplete)
(hab gerade keinen code, da ich das Teil gerade nicht finde)
Aber wenn man sich die BindingCompleteEventArgs in der Hilfe ansieht, kann man erkennen, das da alle Sachen angehängt sind, die man für eine zentrale Validierung benötigt.
Also so praktikable find ich das jetzt auch nicht
Warum hat die Textbox eine FocusBackColor Property?
die brauchst Du dann auch für eine ComboBox, NumericDropDown, RadioButton, CheckBox, DateTimePicker und musst diese dann im Designer für JEDES Control einstellen, das ist als Designer (GUI-Macher) der Horror!
Und der Kunde kann es nicht verändern
Wir verwenden einen sogenannten FieldStyleSupplier
Es ist auch eine statische Klasse names ControlScanner vorhanden.
public class MyForm : Form
{
public MyForm()
{
InitializeComponents();
ControlScanner.Scan(this);
}
}
Im ControlScanner.Scan(Control parentControl) werden alle Children durchgegangen und auch desen Children und desen und desen (rekursive) um sich an die Events zu hängen.
foreach (Control control in parentControl.Controls)
{
if (control is TextBox)
{
control.GotFocus += Control_GotFocus;
control.LostFocus += Control_LostFocus;
// eventuell auch zur Validierung der Eingaben
control.TextChanged += Control_TextChanged
}
}
private void Control_GotFocus(object sender, EventArgs e)
{
Control control = (Control)sender;
control.BackColor = Color.WünschDirWas;
}
Ich sprach vorher den FieldStyleSupplier an. Ein Stück code zur Anregung was der machen könnte, bei uns ist er irgendwie ein bisschen kryptisch.
public Color GetFocusedBackColor(Control control)
{
if (control is TextBox)
// Hole mit magic Code die BackColor für eine Focusierte TextBox
if (control.DataBindings....
// Hole mit magic Code die BackColor für eine Focusierte TextBox mit einem passenden Databinding
}
somit brauchst Du absolut nichts an den Controls selbst ändern, die Eigenschaften werden von aussen draufgesteckt. und die Fokusiert BackColor ist zentral einstellbar.
Noch ist keine Optimierung zu erkennen, da es ganz einfach noch keine gibt.
Ich bin gerade beim Erstellen des Programmes und habe ehrlich gesagt keine Ahnung was da rauskommen wird, sprich ich muss die Optimierungen erst vornehmen, mom. bin ich im einbauen von Multithreading um es von dieser Seite her mal flott zu machen. Weiters mache ich die letzte Arbeit des Programmes, die GUI. danach kommen optimierungen.
neuen Thread brauchen wir nicht, da ich jetzt keine konkrete Frage habe.
bevor ich was frage sollte ich mir mal das reinziehen.
Evolutionäre Algorithmen - Begriffe und Definitionen
Ahh... da bin ich jetzt klüger geworden
WPF zeichnet schwammig, ich bin das Paint-ähnliche Zeichnen gewohnt, ein Pixel ist ein Pixel und fertig
Werd mir den MSDN Beitrag reinziehen und versuchen das schwammige zeichnen abzustellen, das will ich nämlich nicht.
Besten Dank für die Hilfe und den Link
Danke für die Antworten,
natürlich will ich WPF benützen, das OnPaint habe ich weggeschmissen
Hmm, der Strich kommt mir um einiges breiter vor als 1 Pixel ?-)
Muss ich nochmal nachsehen, schaffe ich aber erst morgen abend. Mir kommt vor das ich mit OnPaint, wesentlich dünnere Striche zusammengebracht habe.
Blöde Frage, nur um sicher zugehen dass ich nichts falsch mache
die Strichstärke stellt man mit
myLine.StrokeThickness = 1;
ein?
Oder fehlt da noch was?
Irgendwie ist mir das jetzt spanisch
Grüss euch,
ich muss in meinem Programm ein "paar" Linien auf das Form malen.
Da hat mir mein Arbeitskollege etwas von der Klasse Canvas erzählt.
Nach ner stunde einlesen und probieren, habe ich mein OnPaint weggeschmissen und mir so ein Control hergezogen. Lange Rede kurzer Sinn.
Das Line Object ist irgendwie komisch, white ist nicht gleich white.
Wenn ich 3 Linien übereinander male sind die weisser als die einzelne Linie daneben.
Linien mit einer strichstärke von 1 sind gleich breit wie die mit 0.5?
Gehört das so, oder verwende ich da irgendwas falsch?
ich meinte den Vorschlag bzgl. Simulated Annealing
Irgendwie hat mir der einfach nicht zugesagt.
Wie habe ich ihn implementiert:
Hierbei sei erwähnt, dass ich in der Benamsung der einzelnen Begriffe schon festgestellt habe dass ich mich gelegentlich vertan habe. Zum Beispiel das Wort Chromosom kommt bei mir nicht vor.
ich hab mal ne datenbasis. Wichtig ist, die hat ein Datum und ein Datensatz kennt die, die davor waren, sprich, sie sind untereinander verknüpft (aber immer nur in eine Richtung)
(der Datensatz vom 10.01 kennt den vom 09.01 und 08.01, der vom 09.01 kennt den vom 08.01 und 07.01)
Es sollte auch erwähnt werden, das nach dem zusammenbauen (ist ein längerer Vorgang) alle Element in einer Liste vorliegen. (der vom 10.01 und vom 09.01)
Dann erstelle ich die Gene, da sich die Datenbasis auch von der Struktur her ändern kann muss ich das zur laufzeit machen,
und da ich so flexibel wie möglich sein muss erstelle und kompiliere ich dll's welche ich dann in der Datenbank ablege.
Ein Gen hat im endefekt eine Methode im Stil von:
return {linker Operand} == ({rechter Operand} - allele);
der linke und rechte Operand werden aufgrund der Struktur der Datenbasis ermittelt.
z.b. dataRow[0].Property == (dataRow[1].Property - allele)
dataRow ist die Klasse die z.b. den 10.01 darstellt, der Indexer ist so geschrieben, dass bei [0] der 10.01 zurückkommt und bei [1] der 09.01
ist ein bisschen komisch, aber war eine Vorgabe.
Die 'allele' ist der von Dir erwähnte "Zufallswert (im Idealfall aus dem Wertebereich der Lösung)" (Ich habe den Idealfall)
Nun habe ich meine drei Teile die ich zur generierung benötige
Datenbasis (List<DataRow>)
Gene (List<Gen>)
Allelen (List<Allele>)
nun kommt der GA zum Einsatz und steckt mal alles zusammen.
foreach Gen
foreach Allele
pops.Add( CreatePopulation(gen, allele, dataRows) );
beim ersten Durchlauf erhalte ich ca. 3000 Populationen welche mal in die Datenbank gespeichert werden.
der nächste Durchlauf startet mit der Zeile
List<Population> fittestPopulations = pops.GetFittest();
// fittestPopulations.Count == 500 - 600
ich nehme alle Gene und "idealisiere" meine Allelen um keine sinnlosen Berechnungen zu machen
danach erstelle ich wieder die Populationen, mit dem unterschied dass ich das bestehende Gen-Allele Paar 'kopiere' und das neue Gen-Allele Paar dazugebe
foreach Gen
foreach Allele
pops.Add( CreatePopulation(fittestPop.Genom, gen, allele, dataRows) );
und erhalte, eigentlich mit dem gleichen schema wie oben beschrieben so an die 120.000 neue Populationen.
Was noch zu bearbeiten ist, ist sicher die GetFittest() Methode. Die gibt mir noch viel zu viel zurück
Wie berechne ich die Fittnes?
von allen Populationen suche ich mir die raus, die am meisten dataRows hat. (z.b. 100)
wenn eine andere Population z.b 14 hat, erhält die mal die CountFitness 14 (%)
die zweite Fittness ermittle ich mir mit dem ansehen der einzelnen dataRows. nach einem bestimmten Kriterium sind sie gut oder schlecht.
z.b. 7 sind gut, dann ergibt das 50 (%) -> ergibt in summe 64 (%) von 200 (%).
die ist sicher auch noch zu bearbeiten, vorallem in Richtung gewichtung der einzelnen Werte und vielleicht dem erfinden anderer Kriterien.
Fürs testen, und weiter bin ich noch nicht, reicht es mir wenn nicht immer 0 (%) zurückkommt.
ja
Debug -> Windows -> Threads
In den meisten Fällen ist der Zielwert der Fitness (bzw mathematisch betrachtet das Optimum der jeweiligen Funktion) nicht bekannt
Ja mein algorithmus hinkt ein bisschen, habe ich schon festgestellt, wie ich begonnen habe habe ich viel über die verschiedenen algorithmen gelesen und schön langsam glaube ich, ich habe einige Teile vermischt. Wie ich die 200 ausgerechnet habe dachte ich mir auch "Kann die Evolution in der realen Welt auch mal ein Maximum erreicht haben?" und so hinkt diese Funktion ein bisschen.
Ich habe mir damals und auch heute Deine vorgeschlagene Heuristik angesehen, ich hab sie damals zusammenfassend eine "springende Tiefensuche" genannt. aber aufgrund der ungeheurlichen datenmengen habe ich mich für den evo entschieden. für 0,5% der Datenmenge erhalte ich bereits nach dem 2. Durchlauf 120.000 Populationen die eine Fitness ausgeben (10.000 davon sind für den nächsten Schritt vorgesehen). und ich weis nicht wie weit er da "springen" müsste um die nächste lokale Tiefe finden zu können).
aber besten dank für die Anregungen und Erklärungen !!!
@tkrasinger
Rat mal wie es mir beim programmieren geht, mittlerweile begrüsse ich meinen Laptop wenn er fertig hochgefahren ist
Ok, soweit ich das verstanden habe, ist eine Fehlerfunktion keine Funktion im herkömmlichen Sinn wie eine Methode im Code, sprich etwas das was tut, sondern eher ein Begriff oder Wert der mir hilft zu bestimmen wie nahe ich an der Besten Lösung bin.
Aus meinem Programm:
Ich benütze ja wie bereits erwähnt den Evolutionären Algorithmus. Bei diesem dreht sich im Endefekt alles um die Fittnes einer Popolation.
bei mir ist die höchste zu erreichende Fittnes 200 (wie das jetzt auch immer berechnet wird). Diese Zahl ist allerdings weder praktisch noch theoretisch zu erreichen! soweit ich gesehen habe ist der höchste Wert um die 120.
Falls ich Deine gut verständliche Erklärung verstanden habe könnte man zu diesem Beispiel sagen, "Die Fehlerfunktion beträgt/ergibt 80"? und sollte so gering wie möglich gehalten werden.
Kann man den Satz so stehen lassen?
ich hab gestern gegoogelt, aber ich habe für "Fehlerfunktion" keine Erklärung gefunden die ich verstanden hätte.
Dürfte ich Dich bitten mir dieses Wissen näher zu bringen?
// Edit:
ich schreib einen suchalgorithmus auf basis des Evo. Algorithmus, was ja, soweit gelesen als Grundlage für eine KI dienen kann, ich behaupte aber nicht das ich verstanden habe was ein KI ist, zumal ich glaube, das mein Programm nie intelligent werden wird.
Ja, das Teil ist toll, meiner Ansicht nach ist das Framework dahinter auch nicht schlecht programmiert (abgesehen vom Naming -> umlaute in MethodenNamen)
Falles jemand mal vor hat sich mit KI zu beschäftigen hat er hier die "perfekte" Spielwiese. Einerseits kann man sich selbst mit den Einstellungen der Ameise spielen, andererseits kann man div. Algorithmen einbauen damit sich der Haufen selbst organisiert.
Ich finds ne tolle Idee und ne gute Umsetzung
Nur so am Rande, folgende Zeile (und entsprechende Methode) in Programm.cs in die Methode Main() als erste Zeile einfügen
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
die Methode:
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// in e.ExceptionObject steht die Exception die aufgetreten ist
// ev. in einer MessageBox anzeigen
// wenn Dir das dann nicht weiterhilft, die Innerexception ausgeben
// vielleicht so:
Exception ex = e.ExceptionObject as Exception;
string exceptionMessage = string.Empty;
while (ex != null)
{
exceptionMessage += (ex.GetType().Name + ": " + ex.Message + System.Environment.NewLine);
ex = ex.InnerException;
}
MessageBox.Show(exceptionMessage);
}
ist aber nur schnell hingetippt, ev. wäre der Stacktrace auch mit auszugeben.
Nochmal am Rande, vielleicht hat er mit den MediaPlayer Steuerelementen Probleme?
Aber irgendwie wäre es interessant was der Fragesteller damit eigentich bezwecken will?
Grüss euch,
wir haben in unserer Anwendung einen sogenannten Highlighter eingebaut, welcher die Aufgabe hat Zellen in einem DataGrid nach bestimmten Regeln einzufärben.
Sprich, irgendwann kommt die Zeile
{Cell}.BackColor = color;
und da ist auch unser Problem, wenn die Row markiert ist, sollte ja ein blauer Hintergrund vorhanden sein, aber der Highlighter sagt, gelb
Jetzt habe ich, mehr oder weniger, die ehrenvolle Aufgabe bekommen, die Farben zu "mergen", einerseits zu zeigen, dass die Row markiert ist, andererseits das die Row verändert worden ist, Sprich ein Blaugelb {© Reese von Malcom mittendrin, in der Serie als sie Aspest in der Decke fanden}
Fazit:
Wie kann ich Farben mergen?
ich würde bei den Parametern jetzt nicht soo die Geschwindigkeit als Hauptgrund nehmen, sondern eher die Sicherheit, das der command funktioniert.
vorallem .ToString() bei int hat manchmal eigenartige Auswirkungen, nur so am Rande.
PS:
.Clear() hab ich jetzt auch vergessen zu erwähnen
Also laut fehlermeldung hat er ein Problem mit dem PK (PrimaryKey)
in einem Insertbefehl würde ich den auch nicht setzten, meistens, in meinem Fall alle, sollte das die datebank selbst übernehmen hier einen Wert in die Spalte zu schreiben.
Weiters finde ich den SQL-String ein bisschen schräg, zumindest habe ich noch nie gesehen das so einer funktionieren kann.
INSERT INTO {Table} ({FeldNamen}) VALUES ({Wert})
wenn ich die Datenbank wäre würde ich nicht wissen wo Du die Werte hinhaben willst, allerdings kenne ich ce nicht.
Ich wiederhole mich, ich kenne ce nicht, nur den richtigen und da entzieht es sich vollkommen meines Verständnisses was die Hochkomma im SQL-String zu suchen haben.
"INSERT INTO Table (Tab_TextFeld, Tab_IntFeld) VALUES (@TextFeld, @IntFeld)"
cmd.Parameters.Add("@TextFeld", Cols.GetValue(0));
cmd.Parameters.Add("@IntFeld", (int)Cols.GetValue(1)); // wenn es kein int ist, kennt sich die Datebank ja eh nicht aus.
Wenn ce wirklich ganz anders ist als der echte oder sich mein Wissen ganz hinter dem Nebel des Alters versteckt dann ist dieser Beitrag kommentarlos zu löschen.
zu using
using (TypeName objectName = new TypeName())
{
}
ist gleich zu setzen wie
TypeName objectName = null;
try
{
objectName = new TypeName();
// code
}
finally
{
((IDisposable)objectName).Dispose();
}
sind aber fragen, die generell die Hilfe beantworten könnte
Die Softwarebranche verdient ja im Grunde nur Geld in dem sie anderen Branchen was verkaufen, wenn es wie jetzt den Banken schlecht geht, dann werden Hersteller für Bankensoftware weniger Umsatz machen.
negativ.
Wir schreiben BackOffice software für Banken und die rennen uns jetzt die Türe ein wie seit bestehen der Firma (10 Jahre) nicht gesehen.
Es ist ja nicht so das Problem das die kein Geld haben, sie vertrau(t)en sich nicht mehr, sprich es konnte kein neues Geld angeschafft werden (Deswegen sprang der Staat auch da ein)
Und so richtige Probleme haben ja "nur" Banken die in die Immobilien Kredite aus den USA investiert haben, die anderen haben "nur" Angst, dass sie ihr geliehenes Geld nicht mehr zurückbekommen. (Was zeitweise ja auch eine Konkurswelle ausgelöst hat), aber z.b. die grösseren Österreichischen Banken haben meist in SOEU investiert und die sind nur von den realwirtschaftlichen Auswirkungen der Krise betroffen. Die haben aber genug Geld auf der Kante um das zu Überleben bzw. um die Zeit des Stillstandes für Umbauarbeiten in der Struktur zu nützen und auch in diese zu investieren.
Noch ein Satz am Ende, manche kennen mich vielleicht schon mit einer manchmal eigenartigen Einstellung zu gewissen Dingen.
Stellt euch vor, es ist eine Krise, aber niemand geht hin.
Gibt es sie dann noch?
Ich habe mir mal angewöhnt, dass geht leider nur wenn man Zeit zum Test schreiben hat, in jede Zeile einen Haltepunkt setzen, alle Test ausführen, jeden Haltepunkt bei dem er stehen bleibt entfernen, wenn alle Tests durch sind, muss auch alle Haltepunkte weg sein.
Dann kann man mit Gewissheit sagen "jede Zeile ist getestet"
OffTopic:
nicht ganz OffTopic, deswegen nicht grau:
Es gibt ja das Attribute ExceptionExpected(), mit dem man ja angeben kann welche Exception bei diesem Testfall kommen soll.
Soweit so gut, allerdings, ist mir mal passiert, kann eine Methode an mehreren Stellen die gleiche Exception werfen (mit unterschiedlicher Message).
(z.B. Validierung eines XML-Documents => InvalidXmlDocumentException)
jede Testmethode erwartet diesen Type, es kommt auch dieser, allerdings nicht die richtige. (falsche Message)
Kann man dem Attribute (dem Testframework) das irgendwie beibringen das er die Message auch mit überprüfen soll?
PS:
ja, das Attribute hat auch einen Message-Parameter, laut Hilfe wird dieser dann aber nicht überprüft.
Wäre cool wenn da jemand was wüsste (ausser eigenes Try { } catch { })
Besten Dank im Voraus
So, in Deinem letzten Absatz hab ichs geschnallt
natürlich, ist eine blöde Idee gewesen, Dein Hinweis mit der Tabelle hat mich erleuchtet.
So gesehen ist die Variante im letzten Absatz auch die, die ich nehmen würde
Langer Tag, eine Antwort 😉
Bin leider nicht so das Erklärungstalent... 😕
jep
ich glaube aber auch, das Thema ist nicht so leicht zu klären.
Weiters denke ich, dass das ganze ein bisschen falsch angegangen wurde.
Jedes Objekt soll speichern können und es gibt ein bool ob es das auch soll?
Irgendwie scheint mir das Ableitungs Monster die Probleme zu granular zu lösen.
Ableitung ist im weiteren Sinne eher eine Spezialisierung als ein anfügen von Properties und Methods. Klar, beim ableiten tut man genau das aber die Klasse sollte eher einen tieferen Sinn bekommen als mehr Funktion.
Meinem Verständniss nach hat man bei der Ableiterei eine Abstracte Basisklasse mit abstracten Methoden und die Kinder müssen die überschreiben, aber sonst keine neuen Methoden erfinden, ich bekomme immer ein bisschen Bauchweh wenn ich dass dann doch tue. Properties ist was anderes, aber keine Methoden oder im weiteren sinn eine neue Funktion und die Frage ob speichern oder nicht gehört ganz einfach in die Basisklasse.
ändert sich was am Gerät, warum auch immer, muss man keine neue Ableitungshierachie erfinden sondern einfach nur einen bool wert umsetzen
also wenn das eh so ist, dass es nur ODER gibt, sprich "min-max" oder "mögliche Werte", dann komme ich nur auf so ... 3 Klassen
Bassisklasse und die 2 Ableitungen.
bei einem UND hätte ich recht viel zusammengebracht.
Wie kommst Du auf Maga-Ableit-Orgie?
Also ich habe mir jetzt da den ganzen Beitrag durchgelesen, manches sogar 2 Mal.
Ich versteh was nicht.
Du hast ja das Beispiel gebracht mit dem Drehknopf einer Stereoanage.
diese hat meiner Ansicht nach min-max (10.000 db verursacht Probleme mit Nachbarn 😉 )
aber sonst nichts.
für das bräuchte ich nur eine Ableitung bzw. eine Klasse (Ableitung ist nicht zwingend)
Ich wüsste jetzt nicht, und ich hab ein bisschen überlegt wo ich einen "min-max" Wert benötige UND "mögliche Werte" (einen Schieberegler kann ich auf mögliche Werte einstellen, aber min-max hat herzlich wenig Sinn)
Wenn Du sowas hast würde ich mir mal darüber Gedanken machen ob das so stimmt.
Falls das aber wirklich so sein sollte, was dann aber zu erklären wäre wie das geht, könntest Du ja mal Klassen erstellen, eine für min-max, eine Basisklasse für "mögliche Werte" und was Du sonst noch brauchst.
Dann deine Basisklasse mit der Id UND
einmal von dieser ableiten und eine Property vom Typ "min-max" dazugeben.
einmal von dieser ableiten und eine Property vom Typ "mögliche Werte" dazugeben.
einmal von dieser ableiten und eine Property vom Typ "min-max" und eine Property vom Typ "mögliche Werte" dazugeben.
Und ja, da kommen Klassen zusammen, he, wenn Du zig Tausend einstellungen hast wirst Du wohl nicht mit 3 Zeilen auskommen.
und die Basisklasse bekommt eine abstract Methode GetBla() und jede Ableitung kümmert sich darum entsprechend den vorhandene Properties den jeweiligen code zurückzugeben.
Soweit habe ich Dein Problem verstanden.
wenn ich daneben liege frage ich gleich im Vorhinein um weitere Infos nach
ja
! immer !
egal wie Du den try-Block verlässt, ohne return, mit return oder mit throw new Exception()
Brötchenverdiener, naja im Vergleich zu Wissen und Leistung wohl eher Brotverdiener 😉
Fahre viel mit dem Zug (pendle 260km) und kann da auch privat programmieren.
in beiden Fällen C# mir kommt auch so schnell nichts anderes ins Haus. In der Firma kontakt mit allem was C# so bietet und privat versuche ich mich an Künstliche Intelligenz, stehe beim Evolutionärer Algorithmus, da werke ich seit Februar, bin zwar schon durch aber jetzt halt noch sauber werden.
jep, das ist der einfacher, und Du ersparst dir das ADOX Teil
Vielleicht noch ne kleine Anektode (?) hat nur am Rande was mit Frauen zu tun.
Ebenfalls wieder Telefonsupport.
Hatte da ein Headset und während des telefonierens blieb mir gelegentlich Zeit zum Freecell spielen (7.800 gewonnene Spiele in 3 Jahren)
Er: Ohne Namen oder Grund zu sagen brüllte er wie am Spieß ins Telefon.
Ich: Erfahrungsgemäss lassen wir ihn mal schreien, spielte ich Freecell.
Er: brüllte
Ich: hab mal eines gewonnen, also das nächste
Er: brüllte.
Ich: Na eines geht noch.
Er: legte auf.
Ich: ???
<Ich rufe normalerweise zurück aber ich hatte keine Ahnung wer das war>
<5 Minuten später>
Er: tut mir leid Herr Rossegger, aber ich musste mal Dampf ablassen.
Ich: Ist jetzt nicht so ein Problem, wie kann ich ihnen helfen?
Er: Ja wissen sie, mir wir schön langsam alles zuviel, habe vor 3 Jahren die Firma gegründet und das läuft nicht so gut wie erwartet, mit meiner Frau habe ich deswegen auch schon Probleme und die Sekretärin gefällt mir auch schon besser.
Ich bin froh dass ich solche Leute treffe, da bin ich wieder mit meinen Problemen glücklich
Ist gar nicht so einfach...
war mal 4 Jahre im Telefonsupport für Österreich und Deutschland für unser eigenes Produkt.
Ich: Oh, den Fehler kenn ich, den hab ich gestern behoben.
Sie: Und was mach ich jetzt?
Ich: kein Problem, wir brauchen nur das neue Update reinspielen und es geht.
Sie: Ich kenn mich aber nicht so besonders aus.
Ich: Kein Problem ist ganz einfach und wenn Sie genau das tun was ich sage haben wir das in 3 Minuten über die Bühne gebracht.
Sie: Ok, probieren wir es halt.
Ich: Starten Sie bitte den Windows Explorer.
<Pause>
Sie: Was ist das?
Manchmal muss man halt weiter vorne anfangen, ich glaube 2 mal ich auch den Unterschied zwischen linker und rechter Maustaste erklären. Doppelklick hatte ich öfters
Refelction: Nein
bleibt nur selbst zuweisen.
private string mMember = string.Empty;
private string mMember;
public ClassName()
{
mMember = string.Empty;
}
private string mMember;
public ClassName()
{
InitialzeFields();
}
private InitializeFields()
{
mMember = string.Empty;
}
das sind so ziemlich alle Möglichkeiten die mir einfallen wie man einer string member einen initialen Wert gibt.
Hinweis zu 1.
beim Kompilieren wird dafür ein statischer Konstructor angelegt.
Ich persönlich bevorzuge bei mehreren Members die 3.
ich war auch mal da, und bin ein bisschen weiter (Der Vergleich der Anzahl der Beiträge könnte passen [Neals-Ich-Herbivore])
hab auch mal versucht alles einzuordnen und hab dann den Zettel weggeschmissen.
Es nützt nicht viel Wörter, Begriffe und deren Verbindungen zu kennen wenn man denn Sinn/die Bedeutung in der realen Welt nicht versteht.
Ich habe mich im Wikipedia durch die halbe Welt gelesen um generel mal die Begriffe zu kennen und danach habe ich einfach weiterprogrammiert.
Irgendwann kommt man an eine Stelle: Moment da hab ich was gelesen das könnte mir jetzt helfen. Dann hat man das auch verstanden.
Die Verwendung der Patterns (oder wie die Begriffe auch immer heissen) kann man meiner Meinung nach nicht aus einem Buch lernen und dann Meister in der Verwendung sein. Das kann man nur durchs programmieren werden. (siehe Beitragsanzahl von Herbivor)
hab jetzt beim Durchlesen der links was verständliches gefunden:
Algorithmus der Woche: Das Rucksackproblem -Die Qual der Wahl bei zu vielen Möglichkeiten
besten dank, eines der Probleme habe ich schon gekannt, zumindest das Hamilton heuer ein Problem mit dem Kreis hat kann eh jeder lesen 😉
@dr4g0n76
>>21 schwierigsten Problemen der Informatik.
da gibt es eine Liste? Der google hat leider nicht viel davon gewusst, falls Du was bei der Hand hast würde ich mich über einen Link freuen, Bitte danke
das der Chef zur protokollierung auffordert ist nicht ok.
Aber Hauptsächlich finde ich das Mitarbeiter 4 eine Petze ist, wenn jemand das Recht haben hätte dürfen, dann wäre es Mitarbeiter 3 aus seiner sich verteidigenden Position. "Ich habe es ja nicht anders gemacht als 1 und 2", er wäre dann zwar auch eine Petze aber es wäre verständlicher gewesen. Grundsätzlich hat er Scheisse gebaut und dann braucht er sich nicht auf die anderen rausreden. (Wenn ich in einer Kolone mit 5-6 Autos von Mürzzuschlag nach Wien mit 190 Sachen über die Autobahn brettere, kann ich mich auch nicht darauf hinausreden, dass ich den fliessenden Verkehr nicht aufhalten wollte)
Wenn er (3) es nicht gewusst hat dass man soviel Zeit im Internet verbringen darf, hat der Chef das schlecht, falsch oder garnicht kommuniziert.
Soweit dazu.
Mitarbeiter 4 ist und bleibt eine Petze und/oder Schleimer. Ohne direkt vom Chef darüber angesprochen zu werden hat man nichts zu sagen. Punkt.
Wenn er direkt gefragt wird, soweit ich gelesen habe wurde er es nicht, muss er es sagen, lügen darf er nicht und in Schutz nehmen braucht er auch niemanden. Aber von sich aus zum Chef zu laufen und dann noch über den >> eigenen Account << Informationen über die anderen herzugeben ... solche Jungs haben wir in der Schule einfach verdroschen.
Kann sein das hier meine Einstellung wieder den "Österreicher" in mir durch scheinen lässt aber ich denke dieses Mal ist es nachvollziehbarer.
Meine Meinung ist nicht unbedingt die Meinung aller Österreicher.
(Ich denke sowas sollte ich in die Signatur schreiben 😉 )
mein Projekt piept mich gerade an:
private static AutoResetEvent event1;
private static AutoResetEvent event2;
private static Queue<string> mThreadQueue;
private static object mThreadQueueLock;
static void Main(string[] args)
{
event1 = new AutoResetEvent(false);
event2 = new AutoResetEvent(false);
mThreadQueue = new Queue<string>();
mThreadQueueLock = new object();
CompletionState state = new CompletionState();
ThreadPool.QueueUserWorkItem(new WaitCallback(Thread1Method), state);
ThreadPool.QueueUserWorkItem(new WaitCallback(Thread2Method), state);
event2.WaitOne();
}
private static void Thread1Method(object state)
{
CompletionState completionState = (CompletionState)state;
for (int outerIndex = 0; outerIndex < 10; outerIndex++)
{
lock (mThreadQueueLock)
{
for (int innerIndex = 0; innerIndex < 10; innerIndex++)
{
mThreadQueue.Enqueue(outerIndex.ToString() + "_" + innerIndex.ToString());
Thread.Sleep(100); // nur um eine Zeitintesive Methode zu simulieren (.Sleep == buhh)
}
event1.Set(); // .Set() darf im lock passieren
Thread.Sleep(100); // nur um eine Zeitintesive Methode zu simulieren (.Sleep == buhh)
}
}
completionState.Complete = true;
}
private static void Thread2Method(object state)
{
CompletionState completionState = (CompletionState)state;
do
{
event1.WaitOne(); // .WaitOne() darf unter KEINEN, ABSOLUT KEINEN UMSTÄNDEN in einem lock stehen die der andere Thread benötigt
// ich weis das, ich bin Steirischer Deadlock Master
lock (mThreadQueueLock)
{
do
{
Debug.WriteLine(mThreadQueue.Dequeue());
} while (mThreadQueue.Count != 0);
}
} while (!completionState.Complete);
event2.Set();
}
private class CompletionState
{
private bool mComplete;
private object mCompleteLock;
public CompletionState()
{
mComplete = false;
mCompleteLock = new object();
}
public bool Complete
{
get { lock (mCompleteLock) { return mComplete; } }
set { lock (mCompleteLock) { mComplete = value; } }
}
}
wenn ein Thread auf einen anderen warten muss empfiehlt sich ebenfalls die Verwendung von AutoResetEvent Objekten
2 Threads starten
1: geht zum Server und holt Daten in form von DTO's (structs)
2: beginnt zeitgleich (bei Threads: wann auch immer) und läuft in das WaitOne();
1: kommt vom Server zurück und legt die geholten Items in eine Queue und "drückt" auf Set();
1: geht zum Server und holt Daten (die nächsten 100 z.b.)
2: bekommt die CPU und merkt da hat jemand gedrückt und beginnt mit der Abarbeitung der Items die in der Queue liegen, ist fertig und läuft durch die Schleife wieder in das WaitOne();
EDIT:
es gibt auch ManualResetEvent Objekte