Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Pulpapex
Thema: Regulärer Ausdruck: Gruppen von mehreren Werten
Am im Forum: Rund um die Programmierung

Statt mit \s, muss mit \s+ gesplittet werden. Das sollte es gewesen sein.

Thema: Performance probleme...
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Du kannst statt des Forms-Timers einen System.Threading.Timer verwenden. Der TimerCallback-Delegat wird ohne Zutun in einem eigenen Thread ausgeführt.

Thema: Welche Collection ist geeignet
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Nein,

ich habe den Aufbau oben angedeutet, kein B-Baum. Laut Wikipedia nennt sich das Trie-Baum.

Thema: Performance probleme...
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Du bist jetzt genau über diese Invoke-Geschichte gestolpert. Im Thread ausgeführter Code darf nicht direkt auf Windows-Controls zugreifen, sondern muss dafür Invoke verwenden.

private void tima_Tick(object sender, EventArgs e)
{
   // Läuft nicht im UI-Thread, darf so nicht auf label1 zugreifen.
   label1.Text = DateTime.Now.ToLongTimeString();
}

Für dein Beispiel mit dem System.Windows.Forms.Timer ist eigentlich kein zweiter Thread erforderlich (aber du willst ja gerade Threads ausprobieren).

Such mal im Forum nach Control.Invoke oder ISynchronizeInvoke.


// Edit:
Zu der Sache, warum keine Exceptions geworfen werden. Exceptions in Threads erzeugen keinen StackTrace, es wird nur der Thread beendet. Deshalb den Code in Threads immer komplett in try-catch-Blöcke einschliessen.

Thema: Welche Collection ist geeignet
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich habe eine StringSearchDictionary-Klasse geschrieben. Die erlaubt die Suche mit Wildcards (*, +, ?, ., {m,n}). Man kann auch eine Liste mit Zeichen angeben, auf die die Suche eingechränkt werden soll, allerdings nicht so wie du es brauchst.

Beispiel:

StringSearchDictionary dict = new StringSearchDictionary(stringColl);

IList resultList = dict["ab*nen"];
dict.Remove("ab*nen+");

Intern basiert das Ganze auf einer Baumstruktur. Jedem Baumknoten ist ein Zeichen zugeordnet. Ein String als Schlüssel definiert mit seinen Zeichen einen Pfad in den Baum. Im letzten Knoten des Pfades ist der Wert zum Schlüssel abgelegt. Diese Art von Baum eignet sich besonders gut für Wildcard-Suchen. Sie wird häufig in elektronischen Wörterbüchern eingesetzt.

Wenn dir die Klasse was nützt, kann ich sie heute abend mal online stellen. Sie ist auf jeden Fall sehr schnell. Suchen in 20.000 Begriffen erfolgt ohne spürbare Zeitverzögerung, selbst wenn die Ergebnisliste gross ist.


Gruss
Pulpapex

Thema: Performance probleme...
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
Original von herbivore
Wobei ich es klarer finde, wenn man Control.Invoke sagt. Ist aber Geschmackssache.
Sehe ich auch so. Es gibt nur eine Klasse, die ISynchronizeInvoke implementiert, und zwar System.Windows.Forms.Control.

Das Interface existiert nur, damit Assemblies nicht die System.Windows.Forms.dll referenzieren müssen, um sie unabhängig von Windows Forms zu halten. Direkt im Code verwenden tut man es aber eher selten, finde ich zumindest. Man hantiert eher mit Controls und deren Members.

Thema: contextMenu: kleine Newbie-Frage
Am im Forum: GUI: Windows-Forms

Hallo m4niac,

du kannst im TemplateChose-EventHandler das geklickte MenuItem ermitteln:

private void TemplateChose(object sender, EventArgs e) {

   MenuItem itemClicked = (MenuItem)sender;
   int indexClicked = itemClicked.Index;
   string itemText = itemClicked.Text;
}

Gruss
Pulpapex

Thema: UML Diagramme aus Code generieren
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Dann gibt es noch Visual Paradigm. Gibt es für viele Sprachen und IDEs. Ich hatte mal die Eclipse-Integration ausprobiert. War sehr angenehm und einfach damit zu arbeiten. Nur leider ist es ziemlich teuer und die kostenlose Version ist wie immer stark eingeschränkt.

Thema: Ereignis->Wenn das Formular fertig geladen ist
Am im Forum: GUI: Windows-Forms

Form.Load wird ausgelöst, kurz bevor ein Formular angezeigt wird. Falls du das meinst.


// Verschoben nach Windows-Forms

Thema: portierung von c++ nach c#
Am im Forum: Rund um die Programmierung

Die andere Frage ging eher in die Richtung, ob es natives C++ ist oder managed C++, das schon genau wie C# in die IL-Zwischensprache übersetzt wird. Im zweiten Fall hättest du mit einem Decompiler nach C# zurückübersetzen können. Nur für den Einstieg, wahrscheinlich wäre der Code voll von unsafe-Blöcken wo mit Zeigern hantiert wird.

Aber da es um eine COM-Komponente geht, wird es wahrscheinlich natives C++ sein. Das wirst du von Hand übersetzen müssen. Und wahrscheinlich wirst du mit COM-Interop arbeiten müssen. Besonders am Anfang ist das nicht gerade trivial.


Gruss
Pulpapex

Thema: Hilfe: Compiler schreit und ich weiß nicht wieso!!
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

        
        PrintDocument doc = new Printing.PrintDocument();

[STAThread]
static void Main(string[] args)
{
        doc.PrintPage += new PrintPageEventHandler(printPage);
}

doc ist eine Instanz-Variable. In der statischen Main-Methode ist diese Variable nicht sichtbar. Der Compiler versucht jetzt doc als Klasse zu interpretieren, findet sie aber nicht.

Wenn der Code so bleiben soll, musst du die doc-Mitgliedsvariable static deklarieren.


Gruss
Pulpapex

Thema: Erste Details zu C# 3.0 von Anders Hejlsberg
Am im Forum: Smalltalk

Ich hab mal in den Link von maxE reingeschaut.

Objekt- und Collection-Initializers sind eine gute Idee, finde ich. Man kann dann alle (?) Typen schon bei der Deklaration/Instanziierung vollständig initialisieren. So wie man es heute von Arrays her kennt.

List<string> stringList = new List<string> {"abc", "def", "ghi"};
Person p = new Person {Name="Gonzo", Age=28};

Der Sinn hinter impliziter Typisierung hat sich mir auf die Schnelle nicht erschlossen.

var i = 5; // int i
var s = "abc"; // string s

Was soll es bringen, den Typ nicht mit anzugeben, was wird dadurch vereinfacht? Ich seh's schon kommen, in C# 4.0 gibt es den Variant-Typ.

Thema: Datei durchsuchen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Na dann funktioniert doch alles. Musst ihn nur noch dazu bringen, dass er auf die Position springt, die du haben willst.

Thema: Mit Java überprüfen, ob ein Server / Dienst läuft
Am im Forum: Rund um die Programmierung

Das ist in Java nicht so einfach wie in .Net.

Stichwort "JNI". Man muss sich mit dem javah-Tool eine Header-Datei (*.h) für eine class-Datei mit native-Methoden generieren lassen und dazu eine c-Datei schreiben, die die eigentlich gewünschte Funktion aufruft (EnumServicesStatusEx).

Java Native Interface - Tutorial


Gruss
Pulpapex

Thema: Datei durchsuchen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Was klappte bei dir denn net so ganz mit

fs.Seek(SeekOrigin.Begin, position);

FileStream unterstützt Seek. Eigentlich sollte es so funktionieren.

Thema: ASCII Sondereichen(128-255) ausgeben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

In der Windows-Codepage 1252 gibt es keine Zeichen für Rahmen mehr. Encoding.Default liefert auf Windows-Systemen aber genau diese Codepage.

Versuch' es mal mit Encoding.GetEncoding(850). Das ist die alte Dos-Codepage.


Gruss
Pulpapex

Thema: Threads und Controls
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Man kann es auch von der anderen Seite betrachten.

Control.Invoke ist ein Workaround für eine aus der Win-Api geerbte Unzulänglichkeit von Windows-Forms, nicht mit mehreren Threads umgehen zu können. Warum diese technische Eigenart veröffentlichen und dadurch das Interface versauen?

Es wird quasi unbenutzbar. Und es wird fehleranfälliger, da Members öffentlich gemacht werden, die nicht verwendet werden dürfen - jedenfalls nicht direkt.

Hier ein Beispiel wie ich das meine:

public interface IFileProcessorView {
   public string CurrentAction( get; set; );   // Nur über UIThread aufrufen.
   public string CurrentFile( get; set; );     // Nur über UIThread aufrufen.
   public double OverallProgress( get; set; ); // Nur über UIThread aufrufen.
   public double FileProgress( get; set; );    // Nur über UIThread aufrufen.
   public ISynchronizeInvoke UIThread { get; }
}

// Im Thread ausgeführte Methode.
private void ThreadMethod() {

   IFileProcessorView view = this.fileProcessorView;

   // Verboten!
   view.CurrentAction = "Deleting File ...";


   // Stattdessen folgender Code ...

   // Parameter für BeginInvoke vorbereiten.
   SetCurrentActionDelegate setCurrentAction = 
      new SetCurrentActionDelegate(SetCurrentAction);
   string[] action = new string[] {"Deleting File ..."};

   // BeginInvoke: im UIThread ausführen.
   view.UIThread.BeginInvoke(setCurrentAction, action);
}

// Für den Delegaten notwendige Hilfsmethode.
private void SetCurrentAction(string action) {
   IFileProcessorView view = this.fileProcessorView;
   view.CurrentAction = action;
}

// Delegate für Invoke.
private delegate void SetCurrentActionDelegate(string action);
Das wiederholt sich an allen Stellen wo auf das Interface zugegriffen wird.

Versteckt man den Code in der Implementierung, braucht man sich nicht mehr darum zu kümmern und kann die Interface-Members wieder direkt verwenden. Nur die Implementierung soll ja wissen, dass im Hintergrund Windows-Controls aktualisiert werden.

Thema: Threads und Controls
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Geht es nicht noch einfacher?

Klasse A ruft aus einem "Nicht-GUI"-Thread Methoden des Interfaces auf. Das Interface soll frei von Forms und anderem Schnickschnack bleiben. Die konkrete Implementierung des Interfaces aber, die dann aufgerufen wird, aktualisiert Controls wie du gesagt hast. D.h. sie hält Referenzen auf die Controls. Dann kann doch sie Control.Invoke zum Aktualisieren benutzen. Wozu das öffentliche Interface erweitern?


Gruss
Pulpapex

Thema: merkwürdiges Thread-Verhalten bei DirectX
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

In Threads ausgeführten Code würde ich immer komplett in einen try/catch-Block einschliessen. Ansonsten bekommt man nicht mit, wenn eine Exception auftritt. Der Thread wird nur still und leise beendet.


Gruss
Pulpapex

Thema: Grosse Zahlen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ist natürlich sehr einfach, der Algorithmus und physikalisch wahrscheinlich nicht besonders korrekt. Aber es sieht zumindest realistisch aus.

Gegenstände werden von Wellen umspült. Ein bewegter Körper zieht einen Wellenkeil hinter sich her. Ein Tropfen breitet sich kreisförmig mit mehreren Wellenbergen aus. Alles so wie man es kennt.

Was z.B. nicht modelliert ist, ist das Verhalten bei unterschiedlichen Wassertiefen. Dass sich Wellen im flachen Gewässer auftürmen usw. Überschlagende Brecher und Brandung natürlich auch nicht. Und wirklich bewegtes Wasser, wie Strudel und Strömungen auch nicht. Nur Wellen.

Thema: Grosse Zahlen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Der Wassereffekt ist ein ganz einfacher Algorithmus. Fakultäten und große Zahlen braucht man dafür nicht. Man braucht nicht mal Fließkommazahlen.

Diese Seite hier erklärt den Algorithmus im Detail:
The Water Effect Explained

Ich hatte das mal mit der Seite als Grundlage in Java nachprogrammiert, zum Testen der Geschwindigkeit von SWT (GUI von Ecplise). Läuft flüssig und sieht realistisch aus.


Hier noch eine Seite mit weiteren Implementierungen, zu finden im Abschnitt "Physical Models/Water":
efg's Simulation and Modelling Page


Gruss
Pulpapex

Thema: byteArray aus Stream gelesen,aber nun convertieren?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi,

byte []buffer = new byte[36769];
Passt das komplette Bild des Desktops überhaupt in 35 kByte?

int iBytes = clientsocket.Receive(buffer);
Der Aufruf schreibt nur so viele Bytes in den Buffer, wie in iBytes zurückgegeben wird. Receive muss mehrfach aufgerufen werden, um das Bild komplett zu empfangen. Der Inhalt des Buffers muss dafür natürlich jedes Mal gesichert werden. Oder man verwendet die Receive-Überladung, wo man zusätzlich ein Offset in den Buffer angeben kann.


Wenn nichts dagegen spricht, schau dir die TcpClient-Klasse mal genauer an. Das ist quasi eine Highlevel-API für Sockets.

Beispiel:

Stream stream = tcpClient.GetStream();
Image im = Image.FromStream(stream);

Gruss
Pulpapex

Thema: [GameProgramming/C#] UserControl als eigene Instanz bei jedem GameState?
Am im Forum: GUI: Windows-Forms

Na der GameStateManager schaltet die States um. Also ist es wahrscheinlich auch seine Aufgabe, die State-Controls in der MainForm auszutauschen. Dafür benötigt er eine GameStateManager.MainForm-Eigenschaft, in der die Arch-Form von aussen gesetzt werden kann.


Gruss
Pulpapex

Thema: [Tutorial] Keyword-Highlighting (Einfaches Syntax-Highlighting)
Am im Forum: Artikel

Hi nitronic,

Highlighting für Textbereiche, also für Copy & Paste, kommt im zweiten Teil. Das steht ganz unten im Artikel.

Im Moment wird nur in der Umgebung des Cursors hervorgehoben. Deshalb wundert es mich, dass es bei viel Text flimmern soll. Sollte eigentlich keine Rolle spielen. Ich werde das heute abend mal testen.

@Fabian - den zweiten Teil werde ich die nächsten Tage in Angriff nehmen. Mal schauen.

Thema: [GameProgramming/C#] UserControl als eigene Instanz bei jedem GameState?
Am im Forum: GUI: Windows-Forms

Es fehlt der Code, der das TitleScreenControl zum Arch-Form hinzufügt.



// Control des letzten States entfernen.
archForm.Controls.Clear();

// Control für den TitleScreen-State hinzufügen.
TitleScreenControl titleScreen = new TitleScreenControl();
archForm.Controls.Add(titleScreen);

Gruss
Pulpapex

Thema: Suche in Datei mit RegEx
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich bin auf folgenden Regex gekommen (quasi der selbe wie der von herbivore):

@"^([^\s:=]+)\s*[:=]?\s*(.*)$"

Aufbau:
- Name-Gruppe "([^\s:=]+)": alles bis zum ersten "\s", ":" oder "=" (exklusive).
- Trennzeichen "\s*[:=]?\s*": "\s", ":" oder "=". "\s" auch mehrfach möglich.
- Wert-Gruppe "(.*)": egal was, bis Zeilenende.

Der Regex matcht aber ausnahmslos alles, z.B. auch:
- Name == Wert
- #das ist ein Kommentar.

Die Textdatei darf also nur gültige Name-Werte-Paare enthalten. Das Problem ist, dass "\s" als Trennzeichen zwischen Name und Wert erlaubt ist und dass Trennzeichen auch im Wert vorkommen dürfen. Der exakt matchende Regex dürfte komplizierter und stark in die Länge gezogen ausfallen.


Gruss
Pulpapex

Thema: Wieviele Threads sind möglich
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich glaube Threads machen dir an der Stelle mehr Probleme, als dass sie helfen. In einer Simulation kommt es auf Nachvollziehbarkeit an, Threads aber arbeiten eher nichtdeterministisch. Es ist überhaupt nicht einfach, Threads exakt zu synchronisieren, ist schon bei zwei Threads schwierig. Am Ende bist du nur damit beschäftigt das Ablaufverhalten der einzelnen Threads in den Griff zu bekommen, statt dich um das eigentliche Simulationsproblem zu kümmern.

Kurzum, Threads verkomplizieren das Problem nur, ich würde sie weglassen.


Gruss
Pulpapex

Thema: VB.Net Autsch-Syntax
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Rein informativ:

Tiobe erstellt schon seit ein paar Jahren einen Index über die Grösse der Community einer Programmiersprache.
http://www.tiobe.com/tpci.htm

Was die .Net-Sprachen angeht, liegt C# da klar vor VB.Net. C# liegt auf Platz 7, VB.Net auf Platz 15.

Auf der anderen Seite gibt es viel mehr VB-Programmierer/Projekte (Platz 6) als auf C#-Seite. Wenn man den Prozentangaben trauen kann, mehr als doppelt so viele.

Und gegen Java, C und C++ (Plätze 1, 2 und 3) ist C# quasi 'ne Außenseiter-Sprache. Sagen wir mal noch (obwohl der Abstand gewaltig ist ).

Thema: VB.Net Autsch-Syntax
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Arrays in VB sind nicht wirklich dynamisch, oder? Um die Grösse zu ändern, muss man explizit redimensionieren. Man muss eigentlich vorher wissen wie gross das Array werden soll.

ILists und List<T> passen ihre Grösse wirklich dynamisch an und sind einfacher handhabbar. Dafür sind sie im Zugriff wahrscheinlich langsamer.

Ansonsten, VB-Programmierer können sich ja ne ReDim-Funktion nachprogrammieren:

// Main.
static void Main() {

	byte[] bytes = { 0, 1, 2, 3, 4 };

	// Redimensionieren mit Länge 3, Elemente beibehalten.
	byte[] redim = (byte[]) ReDim((Array)bytes, 3, true);
}

// ReDim-Funktion.
private static Array ReDim(Array array, int length, bool preserve) {

	Type elemType = array.GetType().GetElementType();
	Array redimArray = Array.CreateInstance(elemType, length);

	if(preserve) {
		int len = array.Length < length ? array.Length : length;
		Array.Copy(array, redimArray, len);
	}

	return redimArray;
}

Was anderes macht die originale ReDim-Anweisung auch nicht (nehm' ich mal an).


Gruss
Pulpapex

Thema: Remoting
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich denke es geht darum, dass die Anwendung auf dem Server an die Referenz eines registrierten Service-Objekts kommen soll. Lokal sozusagen.

Das geht aber in zweierlei Hinsicht nicht. Zum einen ist es ein SingleCall-Service (wer J2EE kennt, entspricht einen "Stateless Session Bean"). Weil der SingleCall-Service keinen Zustand speichert, macht es auch keinen Sinn sich ein bestimmtes Objekt zu holen. Sie sind alle gleich und können wiederverwendet werden. Es gibt einen Pool, in dem "gebrauchte" SingleCall-Objekte gecached werden.

Und zweitens, selbst bei einem Singleton-Service bekommt die Server-Anwendung keinen "lokalen" Zugriff auf das Objekt. Sie muss sich auch die "Proxy"-Referenz holen, genauso wie es der Client tut. (Es wird ja die Klasse als "WellKnown" registriert und nicht ein spezielles Objekt, das man noch lokal referenziert haben könnte.)

Registrierte Services können also nur remote aufgerufen werden. Befinden sich Client und Service auf dem selben Rechner, können die Kommunikationswege optimiert werden. Ich glaube statt TCP/IP kommt dann COM+ zum Einsatz, bin mir aber nicht sicher.


Gruss
Pulpapex