Announcement

Collapse
No announcement yet.

Verständnisproblem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verständnisproblem

    Hallo zusammen,

    ich habe ein kleines Problem: Aber zuerst einige Eckdaten.
    Derzeit programmiere ich eine CE Anwendung auf einem SYMBOL Scanner (MC7090). Zur Zeit arbeite ich an einer Ablösung für eine bereits bestehende Software. Da ich einen sogenannten SplashScreen nutzen möchte habe ich mir das Beispiel von Microsoft angesehen und entsprechend in meiner Anwendung eingebaut (SplashScreen als eigener Thread).

    Hier der Event:

    <pre>
    private void frmMain_Load(object sender, EventArgs e)
    {
    Thread aSplashThread = new Thread(new ThreadStart(StartingSplash));
    aSplashThread.Start();
    Thread.Sleep(fSplashMinTimeToShow / 2);
    while (fSplashForm.GetUptime() < fSplashMinTimeToShow)
    {
    InitSystem();
    Thread.Sleep(fSplashUpdateInterval / 4);
    }
    StoppingSplash();
    }
    </pre>

    Allerdings habe ich hier Probleme. Lasse ich den SplashScreen ohne InitSystem() laufen, geht es. LAsse ich den SplashScreen weg und starte nur die InitSystem() Routine, geht es auch. Aber beides zusammen geht nicht, oder nur in einem von 10 Fällen. Es erscheint auch keine Fehlermeldung (try catch ...). In der Routine InitSystem() lade ich alle Stammdaten über einen WebService. Zusätzlich nutze ich noch SYMBOL eigene Routine für ScanEngine usw. Zusätzlich habe ich noch 2 UserControls erstellt, die dem Benutzer den Batterie- und WLAN Status anzeigen.

    Was ich auch probiere, ich bekomme es nicht hin, das der benutzer den SplashScreen sieht, und im Hintergrund die Stammdaten usw. gelesen und gesetzt werden. Vielleicht habet Ihr eine Idee oder sogar eine Möglichkeit, dieses Problem in den griff zu bekommen.

    Gruß

    Sascha:

    confused:

  • #2
    Im vorliegenden code führst Du InitSystem ja recht oft aus, da es in der schleife immer wieder aufgerufen wird...
    Ich habe analoges nur in einem vb.net Projekt realisiert, da habe ich ein Startmodul das als erstes das Haupformular initialisiert, dann einen Splashscreen anzeigt und dann einige Public Subs aus dem noch nicht angezeigten Hauptformular abarbeitet.
    Am Ende zerstöre ich dann den splashscreen und mache ein Application.run(mainform)

    Comment


    • #3
      Hallo,
      erstmal vielen Danke für Deine Antwort. Bin leider erst jetzt dazu gekommen, sorry. Also ich habe die Routine InitSystem jetzt außerhalb der Schleife und alles funktiniert, so wie es soll. Super. Danke nochmal.
      Leider habe ich aber ein neues Problem entdeckt.

      Denn eigentlich soll die Anwendung im AutoStart hinterlegt werden. Wenn ich dies allerdings so einrichte, hängt sich der ganze Scanner weg. Ich habe es schon mit Thread.Sleep probiert, oder Zusatzschleißen eingebaut, leider ohne Erfolg. Mache ich hier etwas falsch? Gibt es eine Möglichkeit zu prüfen, ob der Bootvorgang des Gerätes abgeschlossen ist? Oder gibt es vielleicht sogar einen Trick, an den ich noch nicht gedacht habe?

      Gruß

      Sascha

      Comment


      • #4
        Dafür weiss ich jetzt zu wenig über dein Programm. Ansich kann man eine exe ja problemlos in den Autostart legen, wenn sich das Device mit Deinem Prog im Autostart aufhängt, ist zu vermuten, dass sich Dein Prog aufhängt, wenn es im Autostart ist und dazu fällt mir spontan nur ein, das Du möglicherweise beim Start des Programmes dinge tust, die beim start des Gerätes noch nicht gehen
        Greifst Du z.B. auf andere Programme zu die noch nicht gestartet sind oder dergelcihen? vielleicht läuft der Scanner ja noch nicht und es entsteht eine exeption die Du nicht abfängst?
        Da sich dieser Fall schwer im Debugmodus nachspielen lässt, würde ich ma ein on error goto ... über den gesamten Prozess packen und dann err.message ausgeben wenn was schief läuft.

        Comment


        • #5
          Da stimme ich Dir voll und ganz zu. Wie gesagt, mein SplashScreen läauft als Thread (Source habe ich aus dem internet, bzw. direkt von MS (Example)). Nachdem ich den Thread gestartet habe, rufe ich die Routine InitSystem auf.
          BEvor dies allerdings geschieht, initialisiere ich noch Das WLAN, Battery und Sound Module des Scanners (Scanner ist von Symbol). Sollte hier ein Fehler auftreten, setze ich ein globales Kennezeichen.

          Jetzt die InitSystem !!!
          Dort mache ich sehr viele Dinge wie z.B.:

          Zuerst prüfe ich das globale Kennnzeichen. Dannach versuche ich Stammdaten über einen WebService zu lesen. Dann setzte ich, sofern kein Fehler aufgetreten ist, die Sprache des Frontends, setze die zu lesenden Barcodes, Sound usw. Sollte auch hier alles klappen, rufe ich mit einem Teil der gelesen Stammdaten einen 2. WebService auf, der Verbindung mit unserem ERP System aufnimmt. Auch hier erhalte ich Daten, die der Scanner anzeigen und ggf. interpretieren muss. Danach ist diese Routine durch. Um ein verlassen der Anwendung zu vermeiden, ohne dass es gewollt ist, nutze ich noch folgende Routine:

          public static void ControlGui(Form _Form, Control _Focus)
          {
          _Form.Activate();
          if (_Focus != null)
          {
          if (_Focus.Visible)
          {
          try
          {
          _Focus.Focus();
          }
          catch
          {
          SetLogEntry(_Form, "ControlGui", "Can't set focus on control", null, CategoryId.Client, TypeId.Frontend);
          }
          }
          else
          {
          _Form.Focus();
          }
          }
          else
          {
          _Form.Focus();
          }
          }

          Das ist im Grunde das, was beim ersten Start der Anwendung so passiert.

          Es klappt auch alles, aber halt nur wenn das Programm nicht im AutoStart eingetragen wurde.
          Wo sollte man den einen globalen fehler sinnvollerweise abfangen, damit man auch Fehler auf oberster Ebene mitbekommt?
          Ich arbeite mit C#.

          Comment


          • #6
            hmm, wenn z.B. die SIM Karte beim Start noch nicht bereit ist, könnte es eine exeption bei dem Versuch einer webrequest geben, ich kann leider nicht viel mehr raten, als beim gesamten code der während der Initialisierung des Programmes ausgeführt wird genaustens nachzusehen, ob jeder mögliche Fehler behandelt wird...

            Comment

            Working...
            X