Splash-Screen und Abstürze bei OnUserPreferenceChanged

31/07/2009 - 19:45 von Marvin Massih | Report spam
Hallo,

ich habe eine Anwendung, die ab und zu "einfriert" (mit niedriger CPU-Last).
WinDbg führte mich zu OnUserPreferenceChanged und diesen Artikeln:

[ The OnUserPreferenceChanging Problem ]
http://adam.hathcock.us/?p#

[ Mysterious Hang or The Great Deception of InvokeRequired ]
http://www.ikriv.com/en/prog/info/d...sHang.html

[ OnUserPreferenceChanged Hang ]
http://krgreenlee.blogspot.com/2007...-hang.html

Mit der Freezer.exe des zweiten Links konnte ich meine Anwendung
reproduzierbar zum Einfrieren bringen.

Ich habe dann ein bisschen herumprobiert und festgestellt, dass das
Entfernen meines Splash-Screens hier bereits hilft, danach friert sie
nicht mehr ein.

Der Code sah ungefàhr so aus:

SplashScreen splash = new SplashScreen( );
BackgroundWorker worker = new BackgroundWorker( );
worker.DoWork += delegate { splash.ShowDialog( ); };
worker.RunWorkerAsync( );

// Weitere Initialisierungen

MainForm main = new MainForm( );
form.Load += delegate {
splash.Invoke(new MethodInvoker(delegate {
// Dispose statt Close àndert auch nichts
startDialog.Close();
})
);

Application.Run( main );

Das funktionierte, fror aber eben leider manchmal ein.
Wie schreibe ich das stattdessen sauber, so dass auch das
Einfrier-Problem nicht mehr auftritt?

Ferner zeigt mir Spy++ zusàtzlich zum GUI-Thread noch zu einem anderen
Thread zwei Fenster an:

"GDI+ Window" (GDI+ Hook Window Class)
"Default IME" (IME)

Ist das problematisch? Der dritte Link oben sagt ja, man dürfe nur zum
Mainthread Fenster haben, alles andere könne zur Hàng-Problematik führen.
Falls ja, wie kann ich herausfinden, wo diese Fenster erzeugt werden?

Gruß
Marvin
 

Lesen sie die antworten

#1 Marvin Massih
31/07/2009 - 19:47 | Warnen spam
Marvin Massih schrieb:
startDialog.Close();



Hoppla, sollte natürlich hier auch "splash" heißen.

Gruß
Marvin

Ähnliche fragen