none
Mein Programm läuft nicht auf anderen PCs RRS feed

  • Frage

  • Hallo,

    mein aktuelles Projekt läuft auf dem Entwicklungs-PC stabil und so wie es soll.

    Beim Testen auf anderen PCs habe ich zwei völlig unterschiedliche Systeme.
    1. 12 Zoll Tablett von Lenovo mit Windows 10 Home und
    2. Stationärer PC mit Windows 10 Home Version 1803 64 Bit.

    Auf dem Tablett startet die Anwendung (egal ob Start von HD oder USB-Stick). Stellenweise werden dann Bilder, die anstelle einer Beschriftung den Buttons hinterlegt sind rot umrandet und mit einem X versehen. Anfangs hatte ich das Phänomen verstärkt wenn ich die jeweilige Funktion über die Maus ausgeführt habe. Da da > 90% der Funktionen aber auch mittels KeyCode einer Taste zugewiesen sind, habe ich die Stabilität getestet indem ich die Funktionen per Tastenklick ausgeführt habe. Das war anfangs deutlich stabiler, inzwischen mach die Art wie ich eine Funktion auslöse keinen Unterschied mehr. Ich bekomme dann den Hinweis in der Art, dass da ein Zusammenhang/Fehler mit GDI+ bestünde.

    Am zweiten PC (stationär) wird nur der Begrüßungsbildschirm gezeigt, danach wird die Form1 teilweise aufgebaut (ca. 50% der Buttons) danach schließt sich die Anwendung ohne eine Fehlermeldung.

    Ich arbeite mit Visual Studio 2019

    VB Net und mein Programm ist eine WindowsForms Application.

    Kennt jemand das Problem bzw. die Ursache und vor allem die Lösung?

    Schöne Grüße

    Stefan

    Mittwoch, 14. August 2019 16:26

Antworten

  • Hi Stefan,
    4 Timer und Overlay bedeutet multithreading. Wenn da etwas in der gegenseitigen Verriegelung nicht richtig programmiert ist, können solche Wettlaufsituationen (race conditions) entstehen - mit einer CPU funktioniert es, mit einer anderen nicht richtig (andere Zahl der Kerne, andere Geschwindigkeit).

    Die Timer rufen CallBacks auf. Zu prüfen wäre, ob in den CallBack-Methoden auch Ressourcen außerhalb der CallBack-Methoden angesprochen werden, entweder direkt oder über Verweisvariable. Wenn ja, was passiert, wenn die Zugriffe "gelockt" werden? Gibt es in den asynchron laufenden Methoden auch Fehlerbehandlungen? Wenn diese fehlen, dann können Fehler auftreten, die nicht erkannt werden (wegen anderem Thread) und zu unkalkulierbarem Verhalten führen.

    Das einfache Verschieben von Code aus dem Form_Load in Form_Show bringt nichts außer dem mehrfachen Aufruf in Form_Show, wenn zwischen den Forms gewechselt wird. Ich würde die Logik möglichst weit auslagern (kapseln) und dann mit der Task-Klasse arbeiten, ohne thread-übergreifende Zugriffe zu nutzen. Da kannst Du auch mit einem Testprojekt (Unittest) die Arbeitsfähigkeit prüfen und Stressteste durchführen.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 15. August 2019 18:10

Alle Antworten

  • Hi Stefan,
    das sieht aus wie Wettlaufsituationen (race conditions). Die unterschiedlichen Geschwindigkeiten der CPU und/oder Platten können zu solch unterschiedlichem Verhalten führen. Das kann passieren, wenn parallel gearbeitet wird (z.B. threading, Task mit await). Ohne Dein Programm zu kennen, kann man da nur raten.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Mittwoch, 14. August 2019 19:32
  • Hallo Peter,

    ohne die wahren Hintergründe zu kennen habe ich mir schon so was gedacht wie "Prozessorgeschwindigkeit o.ä.".

    Ich habe nun mal (weil es vermutlich nicht schadet) alles aus dem FormLoad-Prozess in FormShow rübergepackt. Im Ergebnis dauert es nur länger, bis das Missgeschick eintritt.

    Was genau musst du denn zu und über mein Programm wissen um eine bessere Vermutung anzustellen?

    Ich nutze ein SDK von Viscomsoft. Dabei wird das Videobild einer Webcam live in einer PictureBox dargestellt.
    Dieses SDK bietet ein Overlay (um Text oder Bilder über das Livebild zu legen), da nutze ich nur sporadisch mit einer Textzeile die ich in ihrer Position verändere.

    Außerdem bietet das SDK die Möglichkeit das Bild in Graustufen oder invers darzustellen und zu zoomen.
    Was ich daraus gemacht habe ist:

    1. Manueller (alternativ) automatischer Wechsel zwischen den Kameras.

    Ich habe 4 Timer wovon einer permanent ein ist und mir auf Wunsch Datum und Uhrzeit liefert. Die anderen werden je nach Bedarf und Funktion kurz gestartet und dann auch wieder gestoppt. Falls nötig könnte ich auch den ersten Timer nur bei Bedarf starten.

    2. Ich habe die SAPI integriert denn das langfristige Ziel ist, mir auch Text vorlesen zu lassen.

    Falls Du mehr Informationen brauchst und Dir das ansehen willst kann ich Dir auch meinen Code zukommen lassen. 

    LG

    Stefan

    Donnerstag, 15. August 2019 08:00
  • Hi Stefan,
    4 Timer und Overlay bedeutet multithreading. Wenn da etwas in der gegenseitigen Verriegelung nicht richtig programmiert ist, können solche Wettlaufsituationen (race conditions) entstehen - mit einer CPU funktioniert es, mit einer anderen nicht richtig (andere Zahl der Kerne, andere Geschwindigkeit).

    Die Timer rufen CallBacks auf. Zu prüfen wäre, ob in den CallBack-Methoden auch Ressourcen außerhalb der CallBack-Methoden angesprochen werden, entweder direkt oder über Verweisvariable. Wenn ja, was passiert, wenn die Zugriffe "gelockt" werden? Gibt es in den asynchron laufenden Methoden auch Fehlerbehandlungen? Wenn diese fehlen, dann können Fehler auftreten, die nicht erkannt werden (wegen anderem Thread) und zu unkalkulierbarem Verhalten führen.

    Das einfache Verschieben von Code aus dem Form_Load in Form_Show bringt nichts außer dem mehrfachen Aufruf in Form_Show, wenn zwischen den Forms gewechselt wird. Ich würde die Logik möglichst weit auslagern (kapseln) und dann mit der Task-Klasse arbeiten, ohne thread-übergreifende Zugriffe zu nutzen. Da kannst Du auch mit einem Testprojekt (Unittest) die Arbeitsfähigkeit prüfen und Stressteste durchführen.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 15. August 2019 18:10