Einstieg in Desktop Apps - Kleinere Tools sollen es werden

Inxession schrieb:
WPF klingt spannend, die ersten Tutorials hegen noch mehr Interesse.
Aber wenn ich jetzt 550 € für Visual Studio berappen soll, dann hat sich das Interesse direkt wieder gelegt.

Ob Visual Studio Code oder VS Community dafür geeignet ist, kann ich nirgends lesen.

Du meinst, die Tutorials wecken Dein Interesse?

Jetzt stell Dich nicht so an, lade den Mist einfach von hier runter, installiere den Krempel und fang endlich an.
 
@BAGZZlash .. danke für den Arschtritt.

Ich bin mittlerweile schon sehr stolz auf mich.

Das WPF Projekt arbeitet schon in den Grundfunktionen.
Also generell kann ich bereits meine Dateien umwandeln.

Ich versuche es gerade allerdings ein wenig "aufzuhübschen" und hier hab ich ein Verständnisproblem.

Ich habe einen Button "Umwadeln" der im Codebehind eine
C#:
private void Button_Click(object sender, RoutedEventArgs e)
{
}
erstellt.

Dort drin ist meine FOR Schleife, die die einzelnen Zeilen liest und diese mit Append an einer Array Variable anfügt.

Im Grunde also
C#:
private void Button_Click(object sender, RoutedEventArgs e)
{
   for (int i = 0; i < zeilen; i++)
      {
      }
ausgabe = output.ToString();
}
Wenn ich das so ausführe, funktioniert es tadellos und mein Vorhaben wäre erledigt.

Ich möchte gerne eine Progressbar mit einbinden.

Wenn ich diese in die For-Schleife mit einbinde, wird auch der Status in der Progressbar angezeigt, jedoch wird nur noch eine Datei ohne Inhalt ausgegeben.
C#:
pbStatus.Dispatcher.Invoke(() == pbStatus.Value = i, System.Windows.Threading.DispatcherPriority.Background);



....also ohne diese Zeile in der FOR Schleife funktioniert die Umwandlung.
mit dieser Zeile in der FOR Schleife funktioniert NUR die ProgressBar Anzeige.

Jetzt bin ich am überlegen wie ich das ganze parallel verarbeiten kann.

Das die variable "i" an eine weitere Instanz weitergegeben wird, die parallel ausgeführt wird.

Hier stecke ich allerdings fest.

Ich habe für jeden Button ein
private void Button
Abschnitt im CodeBehind.

Kann ich folgendes machen und wie müsste die Übergabe aussehen?
C#:
private void pBar(int i)
{
pbStatus.Dispatcher.Invoke(() == pbStatus.Value = i, System.Windows.Threading.DispatcherPriority.Background);
}

und das i aus der FOR Schleife irgendwie "senden"?

Danke und Gruß
 
Zuletzt bearbeitet:
Bitte Code im Code Block setzen, damit es sinnvoll lesbar ist.

Python:
print("Hello World")
 
  • Gefällt mir
Reaktionen: Inxession
Ein weiteres kleines Problem bereitet mir Kopf zerbrechen....

Im XAML Script nutze ich ein RIBBON Menü.
Die RibbonButtons kann ich mit der Click Eigenschaft im CodeBehing zugänglich machen.

Aber wie mache ich das mit einer RibbonComboBox + RibbonGallery + RibbonGalleryCategory + RibbonGalleryItem.

Dort gibt es das Attribut "Click" nicht.

Wie teile ich dem Codebehind mit welche Value gerade ausgewählt IST/wurde ??

Über Ribbon findet man recht wenig im Web.
Die Beispiele die ich finde haben aber alle keine "Verlinkung" ins CodeBehind.

Vielen lieben Dank
 
Zum Parallelisierungs-Problem:
Wenn die Umwandlung der Zeilen nicht aufeinander aufbaut (also jede Zeile für sich umgewandelt wird und es egal ist was davor / danach kommt) kann man als ganz einfachen Weg die For-Schleife mit Parallel.For ersetzen. C# erledigt dann die Aufteilung der einzelnen Umwandlungen auf mehrere Threads, schaut wie viele Threads Sinn machen usw.
Falls die Performance nicht gut ist, macht es eventuell Sinn, Blöcke aus mehreren Zeilen (keine Ahnung, paar hundert bis tausende würde ich aus dem Bauch raus raten) als ein Paket für einen Thread zusammen zu fassen, damit man nicht für jede Zeile den Overhead hat.

Da man nicht wirklich sieht, wie du deine output-Variable befüllst kann ich nicht genau sagen, was du da anpassen musst damit es Thread-Safe wird - muss man aber im Blick haben.

Zum Progess-Bar Problem kann ich auch nicht viel sagen, ich arbeite wenn möglich nie mit Code-Behind, sondern mit einem MVVM Pattern und Bindings, da sieht es dann immer was anders aus.

Wenn die Projekte größer werden sollten würde ich auf jeden Fall auch empfehlen, irgendein Pattern anzuwenden, dass GUI und Businesslogik trennt. Irgendwann beißt es einen sonst immer, wenn da keine ordentliche Trennung besteht.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Inxession und LieberNetterFlo
@Autokiller677 .. danke dir.

"Leider" ist es so, das die FOR Schleife jede einzelne Zeile nacheinander abarbeitet.
Weswegen die Parallel.FOR dann nicht geeignet ist.

Mühsam ernährt sich ...
 
Das die for-schleife alles nacheinander macht ist klar, dafür ist sie da.
Die Frage ist, ob die einzelnen Iterationen auf den Ergebnissen der vorherigen Schleifen aufbauen.

Beispiel:

C#:
List<int> results = new List<int>()
for (int i = 0; i < 10; i++)
{
    results[i] = i * i
}
Das baut nicht aufeinander auf, hier könnte man parallelisieren.

Die Berechnung einer Fakultät z.B. baut aufeinander auf, dass kann man nicht parallelisieren:

C#:
int i, number, fact;
number = 10
fact = number;
for (i = number - 1; i >= 1; i--)
{
    fact = fact * i;
}

Mit "fact" wird hier das Ergebnis der vorherigen Iteration wieder verwendet und eine Parallelisierung würde scheitern.

Wenn die Konversionen alle aufeinander aufbauen, ist es schwierig zu parallelisieren. Wenn jeder Zeile für sich steht, ist es easy.
 
Meine FOR Schleife sieht so aus ..


C#:
for (int i = 0; i < zeilen; i++)

{

    //
if (bedingung)
{
ausgabe.Append(String+Environment.NewLine)
}
}

Mit ParallelFOR oder dem Background Worker hab ichs bisher nicht geschafft.

Der Rest funktioniert aber problemlos. Und das ist mehr als ich in der kurzen Zeit erwartet habe.
 
Zuletzt bearbeitet:
Naja, interessant ist eben was drin steht, ob das parallelisierbar ist. Die eine Zeile für die Schleife ist immer gleich und sagt nix drüber aus, ob man das parallelisieren kann...
 
Habe es oben ergänzt.
Im Prinzip werden einer Array Variable immer 1 oder mehrere Zeilen hinzugefügt.
 
Um beurteilen zu können, was da passiert, müsste man schon mehr tatsächlichen (lauffähigen) Code sehen. Die Beispiele oben sind viel zu weit reduziert, da kann keiner wissen, was passiert.
Falls du aber deine Daten parallel in mehreren Threads verarbeiten möchtest, müsstest du zumindest beim Zusammenfügen der Zeilen in deine Ausgabe aufpassen. Du könntest bspw. jede Zeile mit Zeilennummer ansprechen und darüber befüllen. Du könntest auch Zeilen blockweise verarbeiten und hinterher die Ausgaben jedes einzelnen Threads einfach blockweise aneinander fügen.
Wenn ich #22 richtig interpretiere, geht es ja aber momentan nicht um parallele Programmierung, sondern um das zusätzliche Anzeigen einer Progress-Bar. Leider kann ich da auch wenig helfen.
 
C#:
string[] resultArray = new string[zeilen];
Parallel.For(0, zeilen, (i) =>
{
    /*
    .... Logik ....
    */
    // verkuerzte Darstellung für if-else
    resultArray[i] = bedingung ? stringToAppend + Environment.NewLine : "";
});

ausgabe.Append(String.Join("", resultArray));

Sowas in der Art könnte gehen wenn die Sachen vor dem if nicht aufeinander aufbauen - aber wie @simpsonsfan sagte, ohne die Logik davor ist es schwer zu beurteilen.

Auch ob sich das überhaupt noch lohnt wenn man das Zusammenfügen des Strings hinter die Schleife lagert ist schwer zu sagen, oder ob der Overhead den Performance-Vorteil wieder auffrisst.

Für eine einfache Progress-Bar benutze ich gerne das Paket hier: https://github.com/ax-meyer/ProgressDialog
Ist aber auf MVVM ausgelegt, da ich normalerweise mit dem Pattern arbeite.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Inxession
Zurück
Oben