vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Backgroundworker + Boolean Variable 
Autor: ModeratorDaveS (Moderator)
Datum: 29.05.11 16:39

Es geht auch viel einfacher
result = filecontent.contains(...) or filecontent.contains(...)
Wenn die Anzahl Vergleiche nicht vorher bekannt ist geht's mit einer Schleife
mit
result = result or filecontent.contains(item(i))

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 29.05.11 13:53

Hallo,

ich habe leider einige Probleme mit Multithreading-Anwendungen, deswegen sind meine Applikationen teilweise ziemlich mies programmiert.

Gerade habe ich eigentlich eine ziemlih simple Geschichte, bei der ich aber einfach nicht weiter komme.

Folgendes, ich habe eine Form mit einem Button, der einen Backgroundworker starten soll:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
  System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
End Sub
In meiner DoWork-Komponente soll er folgendes tun: Eine Textdatei öffnen, nach Wörter suchen und eine Boolean Variable entsprechend setzen:

dim result as boolean = false
Dim sr As StreamReader = New StreamReader("C:\text.txt")
            filecontent = sr.ReadToEnd()
            sr.Close()
 
Select Case filecontent
Case "rot"
result = true
Case "gruen"
result = true
End Select
Zu guter Letzt soll noch das Ergebnis ausgeben werden:

 Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal _
   e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles _
   BackgroundWorker1.RunWorkerCompleted
 
if result = true then
label1.text = "Wort wurde gefunden!"
else
label1.text = "Nix gefunden!"
end if
 
    End Sub
Klappt nur leider nicht. Die Variable bleibt immer false. Egal ob ich die public deklariere oder außerhalb des BGW etc. Ich denke mal das hat was mit den threadübergreifenden Ereignissen zu tun. Nur leider weiß ich nicht wie ich es anders machen muss.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: ModeratorDaveS (Moderator)
Datum: 29.05.11 14:19

Unr result ist auch lokal zur DoWork() Routine?

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 29.05.11 14:31

Ja, die Variable wird dort deklariert. Aber selbst wenn ich sie außerhalb als

public result as boolean = false
deklariere geht es nicht. Habe schon verschiedene Möglichkeiten probiert.

Weitere Frage: Ist die Case-Anweisung so überhaupt möglich?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: ModeratorDaveS (Moderator)
Datum: 29.05.11 15:30

Natürlich wird eine lokale Variable nicht in einer anderen Routine erreichbar sein. Wenn nur auf Class-Ebene deklariert läuft der Code ganz richtig. Angenommen die Datei hat nur das Wort und keinen Zeilenumbruch.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 29.05.11 15:43

Nein, die Datei ist voll mit Text. Geht es dann nicht mit der Select Case Methode?!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: ModeratorDaveS (Moderator)
Datum: 29.05.11 15:47

Du vergleuchst den Inhalt mit "rot" und "gruen". Wenn was anderes drin ist wird der Vergleich doch nie Wahr liefern. Was willst du wirklich machen?

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 29.05.11 16:09

Mhh, ok ... dann ist es ja kein Wunder, das es nicht klappt. Im Grunde möchte ich sowas wie

filecontent.Contains("rot")
machen. Nur etwas effektiver, weil ich vieeeeele Strings habe, nach denen gesucht werden soll und deswegen will ich nicht 100 mal

if filecontent.contains("string") benutzen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Preisser
Datum: 29.05.11 16:19

Hallo,

also viel effizienter geht das eigentlich nicht (außer natürlich man nimmt andere Textsuch-Algorithmen wie Boyer-Moore).

Die naive Textsuche funktioniert ja so, dass man in einer (äußeren) Schleife eine Übereinstimmung des Textes mit dem 1. Zeichen des Suchstrings sucht. Sobald man eine gefunden hat, läuft man in einer inneren Schleife entlang und prüft die weiteren Zeichen des Suchstrings. Wenn man auf eine Nichtübereinstimmung trifft, geht man aus der inneren Schleife wieder raus und macht mit der äußeren weiter.

Wenn man jetzt mehrere Strings auf einmal suchen will, könnte man natürlich in der äußeren Schleife immer auf die jeweils 1. Zeichen aller zu suchenden Strings testen, allerdings ist der Aufwand dann der gleiche, wie wenn man nacheinander alle Strings sucht (also das Contains() mehrfach aufruft).

Beitrag wurde zuletzt am 29.05.11 um 16:23:16 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 29.05.11 16:23

D.h. im Grunde genommen funktioniert mein Code, wenn ich die Variable result in der Class Main als public deklariere und das Ganze mit string.Contains() machen.

In etwa so:

if filecontent.contains() = true or filecontent.contains() = true or usw. then
result = true
else
result = false
Und dann im WorkCompleted die result abfragen?!

Beitrag wurde zuletzt am 29.05.11 um 16:24:14 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Preisser
Datum: 29.05.11 16:32

Hallo,

ja (wobei das "= True" bei "filecontent.contains(text) = True" ja überflüssig ist), aber du kannst ja auch das Ergebnis (result) direkt in der Result-Eigenschaft des DoWorkEventArgs-Objekts, das im Ereignis mitgeliefert wird, verwenden und dann im RunWorkerCompleted-Ereignis wieder abfragen. Denn dafür ist die Result-Eigenschaft ja auch vorgesehen.

Hmm ok, eine Möglihckeit, um die Textsuche ein bisschen schneller zu machen wäre, dass man z.B. ein Array für jedes Char aufbaut (also 65536 Einträge), welches für jedes Char einen Verweis auf eine Liste mit den zu suchenden Strings enthält, die mit dem Buchstaben anfangen, sodass man in der äußeren Schleife mit 1 Zugriff feststellen kann, ob das Zeichen mit dem Anfangszeichen eines zu suchenden Strings übereinstimmt. Allerdings braucht man dafür wieder ein bisschen Vorbereitungszeit.

Beitrag wurde zuletzt am 29.05.11 um 16:36:45 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 29.05.11 16:35

Okay, danke ich werde es mal versuchen. Nun noch eine Frage:

Wie kann ich eine .dll Datei, auf dessen Klassen ich zugreife fest in meine .exe mit einkompilieren, ohne das die sich im Verzeichnis des Programms befinden muss. Sprich ich hab nachher nur mein Programm und die .dll ist integriert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 29.05.11 17:02

Ich hab das jetzt erst mal mit dem BGW und der Variable hinbekommen und auch den überflüssigen Code entfernt. Klappt super!

Danke euch beiden. Hat noch jmd eine Antwort auf meine .dll-Frage?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 31.05.11 19:53

Wie könnte ich mir nun noch anzeigen lassen, welche Strings alle per .Contains() gefunden wurden im Text?!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: ModeratorDaveS (Moderator)
Datum: 31.05.11 19:59

Alle Instanzen mit Position, pro Zeile, für das ganze Dokument?

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 14.06.11 23:11

Nein, ohne Position und für das gesamte Dokument. Es wird ja in dem Dokument nach mehreren Strings gesucht.
Und wenn er einen String findet, soll das Programm meinetwegen unten in einem Label den gefunden String anzeigen. Oder vielleicht mit einer Listbox wo dann alle gefundenen Strings geadded werden.

Also einfach nur sagen, WELCHE Strings gefunden wurden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Backgroundworker + Boolean Variable 
Autor: Cookz
Datum: 13.07.11 15:36

*bump*
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel