loks schrieb:
Was fehlt ist die Performance-Betrachtung.
Ist in meinem Fall weitgehend irrelevant, da ich
Nur eine GUI an meine Client-Schnittstelle flanschen will (oder nenn es den View im MVC Pattern). Das heißt, durch die Schnittstelle zwischen C# und C++ gehen nur die User-Interaktionen und die Events, die als Reaktion auf diese Interaktionen zurückkommen
Das Ganze nur als Testsystem zum rumspielen haben will, d.h. es wird keine Produktiv-Anwendung sein, die unter Schwerlast läuft oder extrem skalieren muss.
Habe jetzt auch grad probiert und noch etwas gegoogelt... aber was ist der Unterschied im Endeffekt? Userforms haben offenbar kein close-Event...
Und den Fehler hab ich jetzt auch behoben:
form.TopLevel = false;
form.Visible = true; // muss dann aber auch noch da stehen... ka warum
Eine Property ist hinter den Kulissen auch nur eine normale Membervariable der Klasse Insofern gelten auch dafür die gleichen Regeln als für normale Member
Bzgl. Problemherd finden: Eine NullReferenceException kann nur beim Zugriff auf einen Member eines Referenztyps fliegen. Insofern kannst du da gezielt danach Ausschau halten. In der Regel kann man sowas natürlich auch locker debuggen, aber ich habe es mir angewöhnt, .NET-Code mit potentiellen NullReferenceExceptions im Hinterkopf zu lesen.
Dravere schrieb:
Firefighter schrieb:
Im Standard steht im Kapitel zu readonly leider auch nichts zum Thema Structs.
Du müsstest womöglich eher schauen gehen, was bei der Kopie von Strukturen steht. Wenn dort einfach steht, dass ein memcpy oder dergleichen gemacht wird, dann ist es "klar".
Grüssli
Das würde 11.3.3 Assignment / 11.3 Class and struct differences sein, worin readonly nicht eingegangen wird, aber dort wird halt generell auf die das Kopierverhalten hingewiesen.
Es geht inzwischen einwandfrei mit der Lösung:
--> Main legt mit daten = new Daten() die Daten-Klasse an
--> Main legt mit berechnung = new Berechnung(daten) die Berechnungs-Klasse an und übergibt die Dateninstanz an einen Konstruktor zur weiteren Verwendung
--> Die Daten-Klasse verwaltet jetzt nur die Daten
--> Jetzt erfolgen die Zugriffe in Main und Berechnung in beide Richtungen als Werte mit daten.i1, daten.i2, daten.e
Ich denke, das kann man so lassen. Das Programm wird deutlich übersichtlicher und leicht erweiterbar. Das Konzept von OOP bleibt gewahrt, es handelt sich nur um wenige öffentliche Daten (etwa 10) zur Ein- und Ausgabe. In C hatte man dafür eine globale Struktur. Kann man brauchen, auch wenn man OOP verstanden hat.
Das ist ein nettes Beispiel aus System.Windows.Control
protected virtual void OnForeColorChanged(EventArgs e)
{
if (this.GetAnyDisposingInHierarchy())
{
return;
}
this.Invalidate();
EventHandler eventHandler = base.Events[Control.EventForeColor] as EventHandler;
if (eventHandler != null)
{
eventHandler(this, e);
}
Control.ControlCollection controlCollection = (Control.ControlCollection)this.Properties.GetObject(Control.PropControlsCollection);
if (controlCollection != null)
{
for (int i = 0; i < controlCollection.Count; i++)
{
controlCollection[i].OnParentForeColorChanged(e);
}
}
}
Hier wird erst das ForeColorChanged-Event ausgelöst. Falls das Control Child-Controls besitzt, müssen die ebenfalls alle über die geänderte Forecolor informiert werden.
Zum einen wurde der Code nach dem OnX-Schema ausgelagert, zum anderen muss ein abgeleitetes Control (wenn es diese Methode überschreibt und Childs besitzt) base.OnForeColorChanged aufrufen, damit die Child-Controls informiert werden.
Ich hab die darüberliegende For Schleife nun parallelisiert(mann soll wenn möglich immer die äußeren Schleifen nehmen, damit nicht soviele Threads erstellt und gelöscht werden) Trotzdem wollte ich das gerne nochmal wissen wie das mit der foreach schleife geht. das kann doch eigentlich nicht so schwer sein.
ls ist einfach nur ein rechteck Bereich in einem Bild,enthält Koordinaten.Ein Compilierbares Minibeispielprogramm habe ich leider nicht im Petto.
Sample[] ls = s.getSubSamples(folds);
//for (int k = 0; k < folds; k++)
Parallel.For(0, folds, k =>
{
if (k != f)
{
foreach (PluginInterfaces.Point point in ls[k])
//Parallel.ForEach(ls[k], point =>
{
CurrentClassificationPipeline.SelectedClassifier.addTrainingExample(
s.Label, i.PixelValue(point.x, point.y));
}
}
});
GPC schrieb:
Na ja, wenn die Textdatei nicht im Unicode-Encoding abgespeichert wurde, dann ist das kein Wunder. Schau einfach mal nach, in welchem Encoding du die Datei abgespeichert hast (z.B. in einem Editor diverse Zeichensätze ausprobieren, bis es richtig aussieht).
Wenn du die Datei mit Notepad erstellt hast und einfach gespeichert hast, ohne etwas einzustellen, dann war das im ANSI-Format. Dafür brauchst du System.Text.Encoding.Default.
Ich empfehle zur allgemeinen Lektüre auch: http://www.joelonsoftware.com/articles/Unicode.html
Ok klingt logisch und es klappt auch. Danke für die Hilfe.
Du erstellst eine Klasse "MyDocument". Die enthält Felder für alles, was in Deinen zukünftigen Dokumenten einmal gespeichert werden soll.
Dann erstellst Du ein UserControl "MyDocumentRenderer", dem Du eine Instanz von MyDocument übergeben kannst, und welches diese hübsch anzeigt. Einen solchen MyDocumentRenderer ziehst Du dann in Deine Form (ich nehme aus Bequemlichkeit an, wir reden über Windows Forms).
Dann brauchst Du noch einen Button "Neu". Üblicherweise platziert man den in einer Buttonleiste. Sein Click-Eventhandler ruft eine Funktion auf, die eine neue Instanz von MyDocument erstellt und diese an myDocumentRenderer1 zur Anzeige übergibt.
Sollten Probleme beim Entwickeln einer dieser Details auftreten (und das werden sie), bitte genauer nachfragen.