Aktion im Hauptthread anstoßen

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von aNd12121.

    Aktion im Hauptthread anstoßen

    Moin,

    ich kommuniziere mit Hilfe einer API (VB.NET) mit einer externen Anwendung. Das funktioniert auch soweit.

    Beim Starten der Software wird überprüft, ob die Rahmenbedingungen erfüllt sind, dass bestimmte Aktionen ausgeführt werden sollen. Hierfür wird eine Windows Form aufgerufen, in der unter anderem ca. 20000 Datensätze durchlaufen. Das dauert einige Sekunden, ist aber vollkommen im Rahmen. Das Aufrufen der Windows Form wird hier über den Haupthread aufgerufen.

    Nun möchte ich nach der einmaligen Überprüfung, regelmäßig überprüfen, ob sich die Rahmenbedingungen geändert haben. Hierfür habe ich einen Timer programmiert, der in regelmäßigen Abschnitten aufgerufen wird. Wird nun aus dem Timer Event ausgehend die Windows Form geöffnet, ist die Abarbeitung de einzelnen Schritte deutlich länger.

    Wie kann ich hier vorgehen, dass ich den Haupthread antriggere, so dass die Windows Form aus diesem heraus geöffnet wird?

    Vielen Dank schon einmal im voraus!

    aNd12121 schrieb:

    Hierfür wird eine Windows Form aufgerufen, in der unter anderem ca. 20000 Datensätze durchlaufen.
    Wieso muss zum Abprüfen von irgendetwas ein Form geöffnet werden?
    "Abprüfen von Rahmenbedingungen" klingt für mich nach etwas, was automatisch und ohne User-Input erfolgen kann.
    Und ohne Form wäre es dann auch viel einfacher zu handeln.

    Warum derselbe Vorgang beim zweiten Mal länger dauert als beim ersten Mal kann man nicht wissen.
    Wird am Vorgang liegen.
    Da wird sinnvoll sein, iwelche schlauen Performance-Tests durchzuführen.
    Meist stellen Performance-Leaks sich heraus als ganz punktuelle Probleme - und die gilt es zu identifizieren.
    Moin,

    danke schon einmal für die Antwort. Scheinbar habe ich mich falsch ausgedrückt.

    Die Rahmenbedingungen werden natürlich ohne Windows Form abgefragt. Erst wenn diese erfüllt sind, kommt es zum Öffnen der Form. In dieser werden dann die Datensätze durchlaufen und dem Benutzer angezeigt.

    Nun ist es so, dass beim Starten der Anwedung einmal gecheckt wird, ob die Rahmenbedingungen erfüllt sind --> wenn ja, Öffnen der Windows Form. Gleichzeitig wird im weiterlaufenden Dienst ein Timer gestartet, der regelmäßig überprüft, ob die Windows Form erneut gestartet werden soll. Wird die Windows Form aus dem Event heraus gestartet, kommt es zu einer deutlich schlechteren Performance.

    Als Informationen zu der verwendeten Anwendung, mit der kommuniziert wird, habe ich herausfinden können, dass hier empfohlen wird, das Auslesen der Datensätze aus dem Haupt Thread heraus zu starten.

    Nun ist mir allerdings nicht klar, wie ich auf einer Timer-Event reagieren kann, gleichzeitig aber wieder in den Haupt-Thread wechsel, um von dort die Form öffnen zu können.
    @aNd12121 Willkommen im Forum. :thumbup:
    Wer oder was verändert denn die Rahmenbedingungen?
    Wem gehören die Quellen dieser externen Anwendung, wo sich das verändert?
    Wenn sie Dir selbst gehören:
    Wenn eine Änderung passiert, kannst Du entweder ein Event senden oder eine Variable setzen.
    Darauf zu reagieren ist jederzeit im MainThread möglich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke :) ich war bis jetzt immer nur stiller Mitleser und konnte so schon eine Reihe meiner Probleme lösen.

    Das ganze ist etwas komplizierter.

    Grundsätzlich handelt es sich sogar um zwei Anwendung.

    Anwendung 1 ist eine Anwendung (Runtime) für die Leittechnik in der Gebäudeautomation. Hier werden dem Bediender die Prozesse visuell dargestellt.

    Weiterhin gibt es einen Editor, in der die Bilder, Datenpunkte (Messwerte, Sollwerte etc.) eingestellt werden. Nun ist es so, dass gefordert wird, dass aus der Runtime heraus der Editor gestartet und hier entsprechend eine Form geöffnet wird, in der die Bearbeitung der Datensätze möglich ist.

    Hierfür gibt es in der Runtime einen Datenpunkt, der abhängig vom Wert, quasi den Trigger für die Ausführung der entsprechenden Form ist. Beim Starten des Editors wird ein Verweis auf die Runtime gesetzt, über die dann direkt der Wert dieses Trigger Datenpunkts abgefragt wird. Hat dieser einen bestimmten Wert, wird die entsprechende Form direkt geöffnet.

    Nun soll aber auch bei bereits geöffneten Editor, das Öffnen der Form möglich sein. Hierfür habe ich zwei Varianten versucht.

    1.) Eigentlich die deutlich elegantere. Ich habe die Triggervariable aboniert und bei Änderung des Wertes in der Runtime, wird wiederum ein Event im Editor-Dienst asgelöst, der die Windows Form öffnet
    2.) Über ein Timer-Event frage ich zyklisch den Wert der Variable ab.

    Bei beiden Umsetzungen, ist es so, dass die Performance deutlich schlechter ist als beim direkten Öffnen nach dem Start des Editors.

    Aus dem Forum der Software habe ich folgenden Beitrag gefunden. Leider ist dieser schon einige Zeit alt und die Aktivität in dem Forum ist sehr gering.

    Jeder Aufruf über die zenon API wird über den Hauptthread gefahren, das ist ist so definiert in COM. Man kann in .NET Multithreading betreiben, jedoch wird der Aufruf selbst dann auf den Hauptthread synchronisiert (von .NET selbst). Diese Synchronisierung benötigt zeit. Das macht bei wenigen Aufrufen gar nix, wenn jedoch x-tausende Aufrufe durchführen werden müssen, dann sehr wohl

    aNd12121 schrieb:

    COM
    ist in der Tat ein eigen Ding, aber ich glaube, dass Du das einfach ignorieren kannst, das ist ein Hinweis, kein Handlungsbedarf.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja, aber das Problem ist ja leider tatsächlich da. Sprich die Abarbeitungszeit ist sicherlich 4-5x so lange. Ich habe ja quasi folgenden Fall.

    Das macht bei wenigen Aufrufen gar nix, wenn jedoch x-tausende Aufrufe durchführen werden müssen, dann sehr wohl

    aNd12121 schrieb:

    x-tausende Aufrufe
    Lassen die sich irgendwie zusammenfassen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ne, leider nicht. Ich durchlaufe halt einmal alle angelegten Datenpunkte im Editor durch und Liste diese in einem Listview auf. Hier gibt es leider auch keine vereinfachte Abfrage.

    Bei kleineren Projekten, fällt es auch gar nicht so sehr auf. Bei dem Testprojekt handelt es sich aber um ein relativ großes Projekt,für das es aber natürlich auch funktionieren muss.

    aNd12121 schrieb:

    Wie gesagt, liegt es an den Abfragen der Datensätze.
    Poste den relevanten Code und markiere die Zeile(n). ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich bin zu einer Lösung gekommen, in dem ich eine Funktion in dem Editor angetrggert habe, die wiederum im Hauptthread ausgeführt wird. Das ist aber sher speziell für die verwendete Software, so dass ich hier nicht genauer auf die exakte Lösung eingehe.

    Vielen Dank trotzdem für die Hilfe!