PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB2010 Programm startet sporadisch nicht


mjs
2012-07-30, 12:20:25
Hallo zusammen,

hattet Ihr schon einmal das Problem, dass ein VB-Programm sporadisch nicht starten möchte und folgende Fehlermeldung auswirft (siehe Bild)?

Im Internet findet man sehr viele Informationen hierzu -ich glaube aber ich kann einen Fehler im Programmcode ausschießen, da es

nur gelegentlich vorkommt
im zweiten Anlauf grundsätzlich funktioniert


Zusätzlich wird mir folgender detailierter Fehlerbericht ausgeworfen:

System.InvalidOperationException: Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.
bei System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)
bei System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
bei System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
bei System.Windows.Forms.Control.Invoke(Delegate method)
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.HideSplash Screen()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.MainFormLo adingDone(Object sender, EventArgs e)
bei System.EventHandler.Invoke(Object sender, EventArgs e)
bei System.Windows.Forms.Form.OnLoad(EventArgs e)
bei System.Windows.Forms.Form.OnCreateControl()
bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
bei System.Windows.Forms.Control.CreateControl()
bei System.Windows.Forms.Control.WmShowWindow(Message& m)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
bei System.Windows.Forms.Form.WmShowWindow(Message& m)
bei System.Windows.Forms.Form.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)



Ich hatte jetzt erst den Splashscreen verdächtigt (welchen ich kurz anzeigen lasse, bevor ich die eigentliche WindowsForm lade), aber dieser Code ist quasi unverändert aus den Vorlagen von VisualStudio übernommen.

Welche Prozesse könnten hier denn gelegentlich störend eingreifen (die Tatsache dass es nur gelegentlich vorkommt, macht eine Fehlersuche echt schwer...)

In jeden Fall Danke ich Vorab für alle möglichen Antworten und Anregungen

Gruß mjs

creave
2012-07-30, 17:43:41
Das liegt daran, dass eines deiner Steuerelemente zwar in Form eines .NET-Objektes schon existiert, darunter auf Win32-Ebene aber noch das entsprechende Gegenstück fehlt. Du bist mit deinem Invoke/BeginInvoke Aufruf wahrscheinlich zu schnell.

Rufe mal testweise die "CreateControl"-Methode auf dem problematischen Control auf, bevor du Invoke aufrufst. Natürlich nur einmal ganz zu Beginn, nicht jedes mal. Das erzwingt die sofortige Erstellung eines Handles.

mjs
2012-07-31, 12:35:45
Hallo creave,

danke für deine Antwort.
Ich habe in meinem Programmcode bislang gar kein Invoke verwendet, auch die vorgefertigten Codebausteine aus meinem Splashscreen enthalten nichts in dieser Richtung.

Ich lade ein Hauptfenster (Form1) zum Programmstart, als Begrüßungsbildschirm eben den Splashscreen (beides über die Projekteigenschaften direkt in der Entwicklungsumgebung eingestellt).

Von wo aus wird das eigentlich gesteuert (zeige Splashscreen xy Sekunden, schließe diesen und lade Form1)?

Im Programmcode dieser beiden Fenster habe ich offengesagt nichts gefunden -kann es sein, dass es noch eine Art "Script-Datei" in meinem Projektordner gibt (und da dieser Invoke-Befehl ausgeführt wird)?

In jedem Fall vielen Dank Vorab für Deine Bemühungen und Gruß
mjs

RattuS
2012-08-01, 01:35:21
Von wo aus wird das eigentlich gesteuert (zeige Splashscreen xy Sekunden, schließe diesen und lade Form1)?

Im Programmcode dieser beiden Fenster habe ich offengesagt nichts gefunden -kann es sein, dass es noch eine Art "Script-Datei" in meinem Projektordner gibt (und da dieser Invoke-Befehl ausgeführt wird)?
Der Einstiegspunkt ist in der Program.cs.

Aber dieser automatisierte "Splash-Screen" läuft eigentlich fehlerfrei.

FlashBFE
2012-08-01, 12:39:00
Wie initialisierst du denn die ganzen Steuerelemente in deinem Programm? Beim Formular sollte das immer im Form1.Load Ereignis passieren und nicht im New-Konstruktor. Ersteres wird nämlich erst aufgerufen, wenn das Formular fertig geladen ist, letzteres irgendwo mittendrin.

mjs
2012-08-02, 10:04:41
Hallo zusammen,

ich habe das jetzt einige Tage auf drei relativ identischen Firmenrechnern ausprobiert, ging die ganze Zeit ohne Probleme.

Ich muss noch dazu sagen, dass meine Anwendung alle drei Tage nach Updates sucht (über das Firmennetzwerk), was eigentlich super funktioniert.

Jetzt am dritten Tag hat ein Rechner (war noch nicht mit der aktuellen Version meines Programms versorgt) erfolgreich aktualisiert, die anderen beiden -welche schon aktuell waren- brachten beide die bekannte Fehlermeldung.

Wie immer kann man mit klick auf "Weiter" problemlos in mein Programm starten (deshalb verstehe ich auch die Fehlermeldung nicht -alles funktioniert doch einwandfrei).

Könnte es am Update Prozess liegen (da habe ich ja nicht viele Möglichkeiten einzugreifen, der kurze Intervall hilft mir aber, die vielen Änderungswünsche meiner Kollegen schnell umzusetzen).

@RattuS: Ich werde trotzdem mal nach dieser Program.cs suchen, einfach um die nicht von mir geschriebenen Prozesse besser zu verstehen.
Danke Dir!

@FlashBFE: Ich habe jetzt noch nicht ganz verstanden wie du das meinst, aber ich schau mir das heute Abend unter Form1.Load nochmal an (ich glaube, ich habe da nicht viel mehr drin stehen, als einmal den Wochentag vom System abzufragen...)

FlashBFE
2012-08-02, 12:19:26
Rattus hat nicht ganz aufgepasst: Hier geht's um VB und der Startcode steht in der Application.Designer.vb. Da ist aber normalerweise nichts interessantes drin, außer dass dein Startformular aufgerufen wird.

Was ich meinte ist, dass du darauf aufpassen sollst, dass keine Steuerelemente (auch Form1 gehört dazu) verwendet werden, bevor nicht das Form1 zu Ende geladen ist, was mit dem Ereignis Form1.Load der Fall ist. Alles in Form1.Load ist also OK.

Gast
2012-08-07, 01:42:42
1.) Ich würde sagen setze einmal zum Testen in der Form1.Designer.vb in jeder Zeile oder nach jedem Block folgende Zeile:

My.Computer.Filesyste.WriteAllText("C:\Temp\out.log",DateTime.Now.toString() & ": Schritt 4711 erfolgreich",True)

Dann schaust du in der C:\Temp\out.log Datei nach, wie weit er gekommen ist (gar nicht rein gesprungen, ganz durchgelaufen, Fehler mitten drin etc.)

2.) Hast du die .pdb Files mit deinem Projekt mit installiert. Wenn nein mach das, dann hast du in der Exception auch die Dateinamen und Zeilennummern, falls der Code in einer von deinen Source Dateien auftritt (bzw. ein Schritt davon dein Code ist).

3.) Wie machst du den Update Vorgang? Kopierst du hier einfach die Dateien per externer .bat Datei über das Programm drüber, während es gerade läuft? Wenn ja, dann könnte das vielleicht die Ursache sein.
Oder machst du das Update manuell im Programmcode selbst. Wenn das der Fall ist, kannst du das schon einmal ausschließen, wenn es schon beim Laden abschmiert und gar nicht so weit kommt.

4.) Sind irgendwelche .NET fremden Verweise eingebunden (ActiveX Steuerelemente, COM Server, Office Automation etc.) Wenn ja, sind vielleicht die Schuld.

5.) Lass mal den Splash weg. Dann kannst du das schon einmal sicher ausschließen.

6.) Kann es vielleicht daran liegen, dass du zwei Instanzen deines Programms gleichzeitig startest und es dann zu einem Ressourcenkonflikt kommt.

mjs
2012-08-07, 13:27:52
Hallo Gast,

danke für deine Antwort:

1 & 2: Muss ich mir ansehen

3: Nein, ich mache die Updates weder über eine .bat Datei, noch manuell mit eigenem Code -ich nutze nur die von Visual Basic angebotene Funktion (siehe Bild)

4: Nein, ich habe zwar ein paar Funktionen importiert (u. a. für Email, DataGrid), aber das sind ja alles .Net Erweiterungen (Import.System.IO etc.)

5: Das mache ich

6: Nein, kann ich ausschließen (ist aber generell eine gute Idee, ich werde zur Sicherheit -um zukünftige Probleme auszuschließen- eine Einzelinstanzanwendung daraus machen)

FlashBFE
2012-08-07, 16:42:56
3: Nein, ich mache die Updates weder über eine .bat Datei, noch manuell mit eigenem Code -ich nutze nur die von Visual Basic angebotene Funktion (siehe Bild)
Als Anmerkung: Das ist die ClickOnce- Veröffentlichung aus Visual Studio. Die benutze ich für alle meine firmeninternen Programme auch und die läuft meiner Erfahrung nach ziemlich zuverlässig. Für solche Probleme kann die kaum verantwortlich sein.

Der Vorschlag vom Gast mit der Logdatei ist gut als letztes Mittel, falls dir sonst die Ideen ausgehen.

Gast
2012-08-08, 12:44:26
ich vermute mal stark, dass du vs oder das programm mit ausreichend rechten startest. nur als hinweis am rande.

wenn du das programm auf irgendwelche ressourcen zugreift und die doppelt vorhanden sind könnten solche dinge zu problemen führen, da vorher benutzte elemente nicht mehr gelöscht werden können.

das eigentliche problem hatte ich bei der verwendung von elementen die man im debugger nicht mehr nachvollziehen kann. daher ist es wohl sinnvoll, das programm zu debuggen. vielleicht bringts auch was das programm mal mit nem profiler zu testen.

was ich wegen der fehlermeldung allerdings eher auch glaube, ist dass ein problem mit den steuerelementen besteht. wenn du die gui zusammengeklickt hast und da viel rumgemacht hast, kann es auch sein, dass der automatisch generierte code für das form durcheinander geraten ist. in diesem fall muss man da aufräumen oder die oberfläche neu machen oder gleich selbst schreiben. da der fehler auch nur beim starten auftritt, kann man das problem schon mal zumindest dahingehend eingrenzen.

Gast2
2012-09-04, 15:19:00
Das ist ein Bug im Visual Studio Feature "Begrüßungsbildschirm". Wenn du den Splashscreen manuell zeigst und verbirgst, tritt der Bug nicht mehr auf (Zum Hintergrund: Der Splashscreen, wenn in VS, rennt in einem eigenen Thread und der UI-Thread versucht, ihn mit BeginInvoke zu schliessen und dann knallt es. Ist ein Bug in .NET)