tutorials.de Buch-Aktion 05/2012
Seite 2 von 3 ErsteErste 123 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
31
ZUGRIFFE
1057
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    paebels paebels ist offline Mitglied Gold
    Registriert seit
    Aug 2011
    Beiträge
    100
    Hallo
    Ich habe da mal eine ganz blöde Frage. Und zwar mache ich quasi etwas ähnliches. Aber ich mag diese Zeilen nicht.
    Code :
    1
    2
    3
    
    DirectoryInfo di = new DirectoryInfo(path);
                    FileInfo[] files = di.GetFiles(searchPattern);
                    DirectoryInfo[] subDirectories = di.GetDirectories();
    Ich selbst mache es immer so und habe keine Performance Probleme
    Code :
    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;
            }
    Es ähnelt sich aber was ist der große Unterschied kann mir wer das erklären
    MfG
     

  2. #17
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    Es ähnelt sich aber was ist der große Unterschied kann mir wer das erklären
    Das du 23 Zeilen brauchst und ich/wir 3?!

    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.

  3. #18
    paebels paebels ist offline Mitglied Gold
    Registriert seit
    Aug 2011
    Beiträge
    100
    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 langsamer
    Geändert von paebels (04.02.12 um 16:32 Uhr)
     

  4. #19
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    Was die Performance angeht, ist es eben bei mir wesentlich fixer. Habe es mit Zeitausgaben getestet auf Life Systemen
    Das ist jetzt aber nicht dein ernst oder?
    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.

  5. #20
    paebels paebels ist offline Mitglied Gold
    Registriert seit
    Aug 2011
    Beiträge
    100
    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
     

  6. #21
    Memfis Memfis ist offline Mitglied Silber
    Registriert seit
    Jul 2003
    Beiträge
    99
    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:

    Code csharp:
    1
    2
    3
    4
    
            private void cmdStop_Click(object sender, EventArgs e)
            {
     
            }
    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
    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)
     

  7. #22
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    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
    Sowohl reine Logik als auch meine Testergebnisse sagen was anderes.

    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
    Selbst wenn man das: (bool)cmdStop_Click == true so schreiben könnte (was man nicht kann) stellt sich die Frage:
    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.

  8. #23
    Memfis Memfis ist offline Mitglied Silber
    Registriert seit
    Jul 2003
    Beiträge
    99
    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.

    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();
                }
    Irgendwie muss ich das "t" mitnehmen, aber genau das funktioniert nicht.

    Edit: Habe eben noch etwas ausprobiert.
    Code csharp:
    1
    2
    3
    4
    5
    
                bool cmdStop = false;
                if ((bool)cmdStop == true)
                {
                    System.Threading.Thread.ResetAbort();
                }

    Code csharp:
    1
    2
    3
    4
    
                while ((bool)cmdStop == true)
                {
                    System.Threading.Thread.ResetAbort();
                }
    Aber auch das funktioniert nicht. Irgendwie drehe ich mich im Kreis.

    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)
     

  9. #24
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    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.

  10. #25
    Memfis Memfis ist offline Mitglied Silber
    Registriert seit
    Jul 2003
    Beiträge
    99
    Das Beispiel verstehe ich leider nicht. Das geht schon damit los, "private Thread t" als Fehler erkannt wird.
    Der Typ- oder Namespacename "Thread" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
    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.

    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)
     

  11. #26
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    Der Typ- oder Namespacename "Thread" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
    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 Fehler bedeutet (in deinem Fall) das dir eine using Direktive fehlt. Nämlich using System.Threading;.

    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.
    Das Beispiel war schon extrem einfach und sollte dir nur zeigen was ein Field einer Class ist. Du musst es also definitiv anpassen.
    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
    PHP-Code:
    Class MyClass{
        
        public function 
    MyFirstFunction(){
            
    $var "foobar";
        }
        
        public function 
    MySecondFunction(){
            echo 
    $var;
        }    
    }

    $class = new MyClass();
    $class->MyFirstFunction();
    $class->MySecondFunction(); 
    Hier ist das c# Äquivalent
    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 erstellst eine neue Klasse.
    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:
    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(); 
    Und hier das gleiche in c#
    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.

    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.
    Eins nach dem anderen. Versuch erstmal zu verstehen was du bisher getan hast.
    Und mit verstehen meine ich wirklich verstehen und nicht "ach ist ja toll, das funktioniert ja.".

    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.
    Die Suche an sich ist eher leichte Kost.
    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/
    Memfis bedankt sich. 
    In order to understand recursion, one must first understand recursion.

  12. #27
    Memfis Memfis ist offline Mitglied Silber
    Registriert seit
    Jul 2003
    Beiträge
    99
    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:
    Code csharp:
    1
    2
    3
    4
    
            class SystemThreading
            {
                public string t = new System.Threading.Thread(delegate() { Search(path, searchPattern); });
            }
    Jetzt meckert C# wegen "path" und "searchPattern". Das kann ich noch nachvollziehen. Also habe ich folgendes gemacht:

    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); });
            }
    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
    8
    9
    
            private void cmdSuchen_Click(object sender, EventArgs e)
            {
                listView1.Items.Clear();
                
                public void test()
                {
                    t.Start(SystemThreading);
                }
            }
    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?

    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)
     

  13. #28
    Memfis Memfis ist offline Mitglied Silber
    Registriert seit
    Jul 2003
    Beiträge
    99
    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?
     

  14. #29
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    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²

  15. #30
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    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

  1. 3D studio max 9, Einschränkungen der Studentenversion?
    Von The Brain im Forum 3D Studio Max
    Antworten: 2
    Letzter Beitrag: 02.03.07, 09:27
  2. Antworten: 0
    Letzter Beitrag: 04.08.05, 09:52
  3. Suchfunktion per Javascript funktioniert nicht richtig
    Von digiTAL im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 08.07.04, 00:15
  4. Auslesen, Einschränkungen!
    Von Bushman im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 13.06.01, 13:27