| |
VB.NET - Ein- und UmsteigerBackgroundworker + 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. | |
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? | |
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?! | |
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. | |
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. | |
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. | |
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. | |
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. | |
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? | |
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?! | |
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. | |
Re: Backgroundworker + Boolean Variable | | | Autor: Cookz | Datum: 13.07.11 15:36 |
| *bump* | |
| 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 |
|
|
Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|