-
Hallo
Ich habe da mal eine ganz blöde Frage. Und zwar mache ich quasi etwas ähnliches. Aber ich mag diese Zeilen nicht.
Ich selbst mache es immer so und habe keine Performance ProblemeCode :1 2 3
DirectoryInfo di = new DirectoryInfo(path); FileInfo[] files = di.GetFiles(searchPattern); DirectoryInfo[] subDirectories = di.GetDirectories();
Es ähnelt sich aber was ist der große Unterschied kann mir wer das erklärenCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public List<DirectoryInfo> readDirectorys(string node) { List<DirectoryInfo> temp = new List<DirectoryInfo>(); DirectoryInfo infoDirectorys = new DirectoryInfo(node); temp.AddRange(infoDirectorys.GetDirectories()); return temp; } public List<FileInfo> readFiles(string node) { List<FileInfo> temp = new List<FileInfo>(); DirectoryInfo infoFiles = new DirectoryInfo(node); try { temp.AddRange(infoFiles.GetFiles()); } catch (Exception e) { System.Windows.MessageBox.Show(e.Message.ToString()); } return temp; }
MfG
-
Das du 23 Zeilen brauchst und ich/wir 3?!Es ähnelt sich aber was ist der große Unterschied kann mir wer das erklären
Es gibt keinen wirklich Nennenswerten Unterschied aber es ist eigentlich völlig unnötig das 1. auszulagern und 2. in eine List<T> zu kapseln.
//edit
Bevor das falsch verstanden wird:
Mit "keine Nennenswerten Unterschiede" meine ich natürlich das es funktional keinen großen Unterschied macht.
Performance technisch sollte klar sein das deine Methode definitiv langsamer ist.Geändert von rd4eva (04.02.12 um 15:44 Uhr)
In order to understand recursion, one must first understand recursion.
-
Hallo
also das auslagern finde ich in einem 3 Schichten Programm nicht unnötig.
Was die Performance angeht, ist es eben bei mir wesentlich fixer. Habe es mit Zeitausgaben getestet auf Life Systemen. Wieso weiß ich nicht. Und ich brauche auch nur 5Zeilen wenn man mal try und das Gedöns weglässt
MfG
oli
p.s ich dachte auch es sei langsamerGeändert von paebels (04.02.12 um 16:32 Uhr)
-
Das ist jetzt aber nicht dein ernst oder?Was die Performance angeht, ist es eben bei mir wesentlich fixer. Habe es mit Zeitausgaben getestet auf Life Systemen
Wenn man das alles mal runter reduziert dann macht "deine" Version exakt das gleiche wie "meine" Version.
Der einzige Unterschied besteht daran das du das Ergebnis (was mein Endergebnis darstellt) dann noch nimmst und in eine Liste packst was laut Doku eine O(n + m) Operation ist.
Und deine Version ist schneller.
Ehrlich jetzt?!
Versteh mich nicht falsch. Mir ist das im Prinzip völlig Wurst welche Version schneller ist.
Aber vielleicht solltest du nochmal ein wenig Performance messen üben.Geändert von rd4eva (04.02.12 um 20:22 Uhr)
In order to understand recursion, one must first understand recursion.
-
Also ich weiß wie man Performance mist und wenn der Zeitstamp es auf einem RL Server mehrfach so wieder gibt denke ich stimmt das schon
-
Ich hatte die nun folgende Frage letzte Woche noch zurückgehalten, weil ich der Meinung war, dass sich die Antwort in meinem Buch finden würde, dass ich mit extra für C# und .net gekauft habe, aber leider ist dem nicht so. Es geht darum, dass ich den Thread so lange laufen lassen möchte, bis der "Stop"-Button gedrückt wird. Leider wird in dem Buch aber alles so erklärt, dass jeder Knopf eine Aktion durchführt, also der Programmcode immer so beginnt:
Wenn ich da ein t.abort(); einsetze wird das logischerweise nicht erkannt. Nun wollte ich das abkürzen und habe kurzerhand das gemacht:Code csharp:1 2 3 4
private void cmdStop_Click(object sender, EventArgs e) { }
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13
private void cmdSuchen_Click(object sender, EventArgs e) { listView1.Items.Clear(); string path = cmbLaufwerk.Text; string searchPattern = "*" + txtSuchbegriff.Text + "*"; System.Threading.Thread t = new System.Threading.Thread(delegate() { Search(path, searchPattern); }); t.Start(); if ((bool)cmdStop_Click == true) { t.Abort(); } }
Egal wie ich es drehe und wende. Ich bekomme es nicht hin, dass der "Stop"-Button eine Funktion übernehmen kann, weil es jedes mal falsch sein soll. Habe auch Varianten wie diese probiert (und zahlreiche andere), aber das wird so nix.
Code csharp:1
if ((bool)cmdStop.Click = true)
Ansonsten wäre das Tool fertig. Kleine Bugs habe ich behoben (Wie beispielsweise Klammerfehler der dazu führte, dass immer *.doc-Dokumente gefunden wurden, selbst wenn es nicht angehakt war)
-
Sowohl reine Logik als auch meine Testergebnisse sagen was anderes.Also ich weiß wie man Performance mist und wenn der Zeitstamp es auf einem RL Server mehrfach so wieder gibt denke ich stimmt das schon
Selbst wenn man das: (bool)cmdStop_Click == true so schreiben könnte (was man nicht kann) stellt sich die Frage:Egal wie ich es drehe und wende. Ich bekomme es nicht hin, dass der "Stop"-Button eine Funktion übernehmen kann, weil es jedes mal falsch sein soll. Habe auch Varianten wie diese probiert (und zahlreiche andere), aber das wird so nix
Wie sollte das Funktionieren?
Versuch dir doch einfach mal den Ablauf des Programms vorzustellen.
Der Thread wird gestartet, es wird geprüft ob stop == true.
Wenn ja: Brich den Thread ab.
Wenn Nein. Mache garnix.
Das wars. Die Prüfung ob stop==true wird genau ein einziges Mal durchgeführt.
Ich hatte dir bereits Links gepostet wo du nachschauen kannst wie es richtig geht.In order to understand recursion, one must first understand recursion.
-
Du hast natürlich recht. Völliger Blödsinn was ich da machen wollte und an welcher Stelle. Ich habe es nun (denke ich) an der richtigen Stelle, aber ich weis eben nicht, wie ich den Thread jetzt überprüfen kann. t.start() kann ich nicht mitnehmen und auch andere Versuche schlugen fehl. Das Beispiel habe ich durchgelesen.
Irgendwie muss ich das "t" mitnehmen, aber genau das funktioniert nicht.Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14
private void Search(string path, string searchPattern) { try { [...] catch (Exception ex) { MessageBox.Show(ex.ToString()); } bool cmdStop = false; if ((bool)cmdStop == true) { t.Abort(); }
Edit: Habe eben noch etwas ausprobiert.
Code csharp:1 2 3 4 5
bool cmdStop = false; if ((bool)cmdStop == true) { System.Threading.Thread.ResetAbort(); }
Aber auch das funktioniert nicht. Irgendwie drehe ich mich im Kreis.Code csharp:1 2 3 4
while ((bool)cmdStop == true) { System.Threading.Thread.ResetAbort(); }
Edit 2: Damit komme ich der Sache wohl schon näher. Allerdings stürzt das Programm dabei ab.Code csharp:1 2 3 4
private void cmdStop_Click(object sender, EventArgs e) { System.Threading.Thread.ResetAbort(); }
Geändert von Memfis (06.02.12 um 13:00 Uhr)
-
Dein Problem ist doch ganz einfach das du an den Thread bzw. die Variable nicht "ran kommst".
Es gibt zig Möglichkeiten das Problem zu lösen und die einfachste wäre vermutlich die Variable zu einem Class Member (Field) zu machen.
Hier ein ganz einfaches Beispiel.:
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public class Foo { //Ein Field private Thread t; private void Bar() { //Das Field Initialisieren t = new Thread(); } private void DoSth() { //Auf das Field zugreifen t.Start(); } }
Geändert von rd4eva (06.02.12 um 14:46 Uhr)
In order to understand recursion, one must first understand recursion.
-
Das Beispiel verstehe ich leider nicht. Das geht schon damit los, "private Thread t" als Fehler erkannt wird.
Kannst du das Beispiel konkretisieren, ohne gleich den fertigen Code für mein Programm zu posten? Ich finde es schon gut, wenn ich das Beispiel selber für mein Tool anpassen muss, denn abschreiben kann jeder und so muss ich zumindest noch ein bisschen mitdenken und lerne es hoffentlich dabei.Der Typ- oder Namespacename "Thread" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
Außerdem würde ich am Ende der Suche gerne noch die Meldung ausgeben, dass die Suche abgeschlossen ist, aber egal, wo ich mein "MessageBox.Show("Die Suche wurde abgeschlossen");" hinpacke, es wird nach jedem Schleifendurchlauf angezeigt (oder auch gar nicht). Vermutlich muss hier wieder ein extra-Befehl her, aber "finally" ist es nicht.
Mal ganz nebenbei gefragt: Ist so ein Suchprogramm wie es hier im Thread behandelt wird ein eher einfaches Programm, dass man als Anfänger problemlos selber lösen können sollte oder doch schon eine größere Nummer? Ich meine ohne die großzügige Hilfe deinerseits wäre ich wohl längst nicht so weit, hätte noch nicht einmal die Suchoption fertig.Geändert von Memfis (07.02.12 um 10:21 Uhr)
-
1. Wenn man mit solchen Fehlern nichts anfangen dann hilft google einem 100% weiter. Du bist schließlich nicht der erste dem ein Compiler Fehler um die Ohren geworfen wird.Der Typ- oder Namespacename "Thread" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
Der Fehler bedeutet (in deinem Fall) das dir eine using Direktive fehlt. Nämlich using System.Threading;.
Das Beispiel war schon extrem einfach und sollte dir nur zeigen was ein Field einer Class ist. Du musst es also definitiv anpassen.Kannst du das Beispiel konkretisieren, ohne gleich den fertigen Code für mein Programm zu posten? Ich finde es schon gut, wenn ich das Beispiel selber für mein Tool anpassen muss, denn abschreiben kann jeder und so muss ich zumindest noch ein bisschen mitdenken und lerne es hoffentlich dabei.
Lass mich versuchen es dir an einem PHP Beispiel zu erklären da du dich in PHP ja anscheinend auskennst.
Was du Bisher machst ist ungefähr folgendes
Hier ist das c# ÄquivalentPHP-Code:Class MyClass{
public function MyFirstFunction(){
$var = "foobar";
}
public function MySecondFunction(){
echo $var;
}
}
$class = new MyClass();
$class->MyFirstFunction();
$class->MySecondFunction();
Du erstellst eine neue Klasse.Code csharp:1 2 3 4 5 6 7 8 9 10 11 12
class MyClass { public void MyFirstFunction() { string var = "foobar"; } public void MySecondFunction() { Console.Write(var); } }
Du führst die Methode MyFirstFunction aus ( in deinem Fall wäre das die cmdSuchen_Click Methode).
Diese Methode setzt eine Variable hier $var und weist ihr einen Wert zu. ( In deinem Fall ist $var = System.Threading.Thread t denn t ist auch nur eine Variable die einen Wert hält)
Und jetzt führst du die zweite Methode MySecondFunction aus ( in deinem Fall wäre das cmdStop_Click)
Die Methode MySecondFunction versucht jetzt auf die Variable $var zuzugreifen die von MyFirstFunction erstellt wurde. ( Du versuchst von cmdStop_Click auf t zuzugreifen welches von cmdSuchen_Click erstellt wurde)
Und genau hier liegt das Problem, denn der Zugriff auf eben diese Variable ist nicht möglich.
MySecondFunction kennt die Variable überhaupt nicht und kann somit auch nicht auf sie zugreifen. (Das Stichwort in diesem Zusammenhang heißt Scope)
Damit nun also MySecondFunction auf die Variable zugreifen kann müssen wir sie in einen Bereich legen in dem sie von allen beiden Methoden aus erreichbar ist.
Und so würde es dann funktionieren:
Und hier das gleiche in c#PHP-Code:Class MyClass{
public $var;
public function MyFirstFunction(){
$this->var = "foobar";
}
public function MySecondFunction(){
echo $this->var;
}
}
$class = new MyClass();
$class->MyFirstFunction();
$class->MySecondFunction();
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14
class MyClass { public string var; public void MyFirstFunction() { this.var = "foobar"; } public void MySecondFunction() { Console.Write(this.var); } }
Sehr viel einfacher kann ich es nun nicht mehr erklären.
Eins nach dem anderen. Versuch erstmal zu verstehen was du bisher getan hast.Außerdem würde ich am Ende der Suche gerne noch die Meldung ausgeben, dass die Suche abgeschlossen ist, aber egal, wo ich mein "MessageBox.Show("Die Suche wurde abgeschlossen");" hinpacke, es wird nach jedem Schleifendurchlauf angezeigt (oder auch gar nicht). Vermutlich muss hier wieder ein extra-Befehl her, aber "finally" ist es nicht.
Und mit verstehen meine ich wirklich verstehen und nicht "ach ist ja toll, das funktioniert ja.".
Die Suche an sich ist eher leichte Kost.Mal ganz nebenbei gefragt: Ist so ein Suchprogramm wie es hier im Thread behandelt wird ein eher einfaches Programm, dass man als Anfänger problemlos selber lösen können sollte oder doch schon eine größere Nummer? Ich meine ohne die großzügige Hilfe deinerseits wäre ich wohl längst nicht so weit, hätte noch nicht einmal die Suchoption fertig.
Das schwere ist das Multithreading auf das du (im nachhinein betrachtet) vielleicht erstmal verzichten solltest.
Abschließend hier noch ein Link der dir evtl. weiterhilft:
http://www.guidetocsharp.de/In order to understand recursion, one must first understand recursion.
-
Also dein kleines Beispiel habe ich problemlos verstanden, aber ich bekomme es nicht in mein Projekt übertragen. In deinem Beispiel geht es nur um eine Variable, die in der ersten Funktion einen Wert zugewiesen bekommt und in der zweiten Funktion wird dieser Wert dann abgerufen bzw. ausgegeben. Soweit also kein Problem.
Ich habe also eine Klasse für meine Funktion erstellt. So:
Jetzt meckert C# wegen "path" und "searchPattern". Das kann ich noch nachvollziehen. Also habe ich folgendes gemacht:Code csharp:1 2 3 4
class SystemThreading { public string t = new System.Threading.Thread(delegate() { Search(path, searchPattern); }); }
Jetzt meckert C# zusätzlich noch wegen "cmbLaufwerk"und "txtSuchbegriff". Auch das kann ich noch irgendwie nachvollziehen, weil die Klasse ja noch nirgends bekannt ist. Also habe ich versucht genau das zu machen:Code csharp:1 2 3 4 5 6 7
class SystemThreading { public string path = cmbLaufwerk.Text; public string searchPattern = "*" + txtSuchbegriff.Text + "*"; public string t = new System.Threading.Thread(delegate() { Search(path, searchPattern); }); }
Zur allgemeinen Erheiterung habe ich jetzt aus anfänglich 3 Fehlern (Beim ersten der Klasse) geschlagene 18 Fehler gemacht und bin am Ende. Wie soll das funktionieren?Code csharp:1 2 3 4 5 6 7 8 9
private void cmdSuchen_Click(object sender, EventArgs e) { listView1.Items.Clear(); public void test() { t.Start(SystemThreading); } }
Edit: Ich bin so durcheinander, dass ich zuletzt versehentlich einen völlig unsinnigen Code gepostet hatte. Ich meine, dieser hier ist nicht besser, aber meiner Ansicht nach wenigstens nachvollziehbar
Mit ein bisschen Glück ist es ja nur noch ein kleiner Fehler mit großer Wirkung.
Mit dem Code lehne ich mich an deinem Beispiel an. Unlogisch bleibt noch, warum der Name der Funktion (in deinem Fall das "MyFirstFunction" und "MySecondFunction" keine weitere Bedeutung haben soll) Ich habe dahingehend experimentiert und mal mehr, mal weniger Fehler erhalten. Die Lösung war jedenfalls nicht darunter.Geändert von Memfis (13.02.12 um 11:27 Uhr)
-
Ich weis, dass ich eigentlich schon viel zu viel Hilfe in Anspruch genommen habe, aber es wäre auch schade, dass das Tool jetzt an der nicht vorhandenen "Stop"-Funktion scheitern würde, bzw. keine Meldung ausgegeben wird, wenn alle Verzeichnisse durchsucht wurden. Vielleicht erbarmt sich der ein oder andere noch?
-
Ich habe den Thread nicht verfolgt - er war mir zu lang
. Ab welchem Post sollte ich lesen um rd4eva abzulösen und dir bei der Stop-Funktion zu helfen?
hihi = -h²
-
Danke Shakie, bin gerade etwas ausgelastet.
In #21 / #23 sollte klar werden wo sein Problem liegt.
#24 / #26 sind eigentlich nur Grundlagen Erklärungen von mir und zielen nicht speziell auf sein Problem ab.In order to understand recursion, one must first understand recursion.
Ähnliche Themen
-
3D studio max 9, Einschränkungen der Studentenversion?
Von The Brain im Forum 3D Studio MaxAntworten: 2Letzter Beitrag: 02.03.07, 09:27 -
nach dem löschen eines eintrages in der acces, db funktioniert die suchfunktion nicht
Von zioProduct im Forum Visual Basic 6.0Antworten: 0Letzter Beitrag: 04.08.05, 09:52 -
Suchfunktion per Javascript funktioniert nicht richtig
Von digiTAL im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 08.07.04, 00:15 -
Auslesen, Einschränkungen!
Von Bushman im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 13.06.01, 13:27



7Danke

Zitieren
Login





