Threading Alternative?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Threading Alternative?

    Hallo.

    Ich benutze Abbyy FineReader, um Texte erkennen zu lassen.

    Ich habe eine Winform mit einigen Tabpages.

    Jetzt habe ich folgenden Code:

    VB.NET-Quellcode

    1. Private Sub Testo()
    2. RecognizeText(J.AbbyExePath, J.AbbyFbtFilePath, Bildzurerkennung)
    3. While Process.GetProcesses.OfType(Of Process).ToList.Exists(Function(c) c.ProcessName = "FineOCR")
    4. End While
    5. Dim ErkannterText As String = Clipboard.GetText()
    6. Dim tries As Integer = 0
    7. While Not ErkannterText.Length = 4 OrElse Not J.IsM(ErkannterText, "^[a-zA-Z\d]+$")
    8. If tries = 10 Then Exit While
    9. Try : ErkannterText = Clipboard.GetText() : Catch : End Try
    10. Thread.Sleep(700)
    11. tries += 1
    12. End While
    13. File.WriteAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.txt"), ErkannterText)
    14. End Sub



    Das Problem ist, ich möchte die Form weiterhin bedienen können.

    Dafür habe ich folgendes getestet:

    VB.NET-Quellcode

    1. Dim Tr As New Thread(Sub() Testo())
    2. Tr.IsBackground = True
    3. Tr.Start()


    So funktioniert das mit den Controls auch super, man kann die Form weiterhin benutzten.

    Das Problem ist jedoch, dass der Text nicht mehr vom Clipboard in die Variable gelesen wird.


    Kann mir jemand sagen, woran das liegen kann? Wie kann man das lösen?
    Hallo Daniel,

    Du nutzt .NET 4.5? Dann kannst du auf Threads verzichten und dich mit Tasks und den Async/Await-Spezifizierern vertraut machen.;)
    Kopiert dieses Abby-OCR den geparsten Text denn in die Zwischenablage? Ich gehe nicht davon aus, dass es .NET ist? Ist es eine Konsolenanwendung? Startest du es selbst?

    Grüsse

    Higlav
    Hey,

    danke für die Antworten!

    @ Higlav, ja ich nutze .Net Framework 4.5.

    Ja, abby OCR kopiert den erkannten Text in die Zwischenablage.

    Ich habe eine WinForm Anwendung und eine Klassenbibliothek (ClassLibrary, die selbst erstellt ist).

    In dieser ClassLibrary öffne ich Abbyy FineReader mit bestimmten Parametern.


    Das Problem hat sich jedoch gelöst, habe den Single Thread Apartment aktiviert (Thread.SetApartmentState(...))


    Gibt es btw. eine Alternative zu Thread.Sleep ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Daniel Baumert“ ()

    *hust* Man sollte halt die Sprache beherrschen *hust*
    LINQ ist hier absolut nicht nötig, denn das gibt Dir ja bereits Process zurück, was soll man da noch an Typen filtern?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Dem Code solltest du ganz schnell aus deinem Projekt löschen. Der macht teilweise gar keinen Sinn und ist extrem unperformant. Anstatt zweimal solange zu loopen bis diese (seltsamen) Abfragen erfüllt sind nimmt man entsprechende Events. Try - Catch's ohne Fehlerbehandlung sind ein NoGo. Ebenso den Thread schlafen zu legen. Da kann die GUI ja garnicht reagieren, Code wird in einem Thread immer hintereinander ausgeführt nie gleichzeitig.
    Es wurde zwar schon genannt, jedoch wohl nicht wirklich beachtet: Neue Threads erstellen verbraucht unnötig Ressorucen. Für solche Dinge gibt es einen ThreadPool welcher ab .NET 4.0 noch zusätzlich durch Tasks abstrahiert wurde. Mit .NET 4.5 geht sogar soweit, dass du mit async/await Schlüsselwort nichtmal mehr wirklich viel vom Multithreading merkst.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.