2012-08-17 39 views
0

我創建了一個winforms多線程應用程序。只要主線程啓動,就會在另一個新產生的後臺線程上創建啓動畫面的窗體。UI有時會掛起(Windows窗體C#)

Code: 
static SplashForm sf = new SplashForm(); 
main() 
{ 
... 
    Thread t = new Thread(new ThreadStart(runSplash)); 
    t.IsBackground = true; 
    t.start(); 
Application.Run(new MainForm()); 
... 
} 

void runSplash() 
{ 
Application.Run(sf); 
} 

後來在主線程上創建了一個MainForm,在mainform的加載事件處理程序中正在關閉splash窗體。

有時UI掛起。

即它不響應鍵盤或鼠標操作。但是主線程和其他線程正在優雅地運行。

得到使用間諜++

<00001> 000103A6 S WM_WINDOWPOSCHANGING lpwp:003DF0DC 
<00002> 000103A6 R WM_WINDOWPOSCHANGING 
<00003> 000103A6 S WM_NCPAINT hrgn:00000001 
<00004> 000103A6 S WM_GETTEXT cchTextMax:510 lpszText:003DDBAC 
<00005> 000103A6 R WM_GETTEXT cchCopied:37 lpszText:003DDBAC ("I") 
<00006> 000103A6 R WM_NCPAINT 
<00007> 000103A6 S WM_ERASEBKGND hdc:D5010AC2 
<00008> 000103A6 R WM_ERASEBKGND fErased:True 
<00009> 000103A6 S WM_WINDOWPOSCHANGED lpwp:003DF0DC 
<00010> 000103A6 R WM_WINDOWPOSCHANGED 
<00011> 000103A6 S WM_ACTIVATEAPP fActive:True dwThreadID:000008A8 
<00012> 000103A6 R WM_ACTIVATEAPP 
<00013> 000103A6 S WM_NCACTIVATE fActive:True 
<00014> 000103A6 R WM_NCACTIVATE 
<00015> 000103A6 S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null) 
<00016> 000103A6 R WM_ACTIVATE 
<00017> 000103A6 S WM_IME_SETCONTEXT fSet:1 (LONG)iShow:C000000F 
<00018> 000103A6 S WM_IME_NOTIFY dwCommand:00000002 dwData:00000000 
<00019> 000103A6 R WM_IME_NOTIFY 
<00020> 000103A6 R WM_IME_SETCONTEXT 
<00021> 000103A6 S WM_SETFOCUS hwndLoseFocus:(null) 
<00022> 000103A6 R WM_SETFOCUS 
<00023> 000103A6 P WM_PAINT hdc:00000000 
<00024> 000103A6 S WM_SETCURSOR hwnd:000103A6 nHittest:FFFE wMouseMsg:WM_MOUSEMOVE 
<00025> 000103A6 R WM_SETCURSOR fHaltProcessing:False 
<00026> 000103A6 S WM_SETCURSOR hwnd:000103A6 nHittest:FFFE wMouseMsg:WM_MOUSEMOVE 
<00027> 000103A6 R WM_SETCURSOR fHaltProcessing:False 
<00028> 000103A6 S WM_NCACTIVATE fActive:False 
<00029> 000103A6 S WM_GETTEXT cchTextMax:510 lpszText:003DDBAC 
<00030> 000103A6 R WM_GETTEXT cchCopied:37 lpszText:003DDBAC ("I") 
<00031> 000103A6 R WM_NCACTIVATE fDeactivateOK:True 
<00032> 000103A6 S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null) 
<00033> 000103A6 R WM_ACTIVATE 
<00034> 000103A6 S WM_ACTIVATEAPP fActive:False dwThreadID:00000BB0 
<00035> 000103A6 R WM_ACTIVATEAPP 
<00036> 000103A6 S WM_KILLFOCUS hwndGetFocus:(null) 
<00037> 000103A6 R WM_KILLFOCUS 
<00038> 000103A6 S WM_IME_SETCONTEXT fSet:0 (LONG)iShow:C000000F 
<00039> 000103A6 S WM_IME_NOTIFY dwCommand:00000001 dwData:00000000 
<00040> 000103A6 R WM_IME_NOTIFY 
<00041> 000103A6 R WM_IME_SETCONTEXT 
<00042> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000 
<00043> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000 
<00044> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000 
<00045> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000 
<00046> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000 
<00047> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000 

是什麼原因造成這個問題,如何擺脫這種以下日誌消息?

+1

如果沒有進一步的信息,就不可能說出這個問題。例如它究竟是什麼時候掛?那時執行什麼代碼? – 2012-08-17 05:49:28

+0

當它處於掛起狀態時,您可以附加到應用程序並檢查Visual Studio中的「線程」窗口中的線程。這將指出你在哪個線程等待哪個對象/線程的正確方向。 – 2012-08-17 05:52:22

回答

3

爲什麼選擇spy ++?你需要創建一個內存轉儲(使用winDBG等)並分析它。

有時UI掛起,即它不響應鍵盤或鼠標操作。但是主線程和其他線程正在優雅地運行。

GUI需要在主線程上。此代碼顯示在另一個線程的啓動畫面:

Thread t = new Thread(new ThreadStart(runSplash)); 
t.IsBackground = true; 
t.start(); 

Windows窗體控件沒有本質上就是線程安全的,你可以隨處讀了這一點,如:
In WinForms, why can't you update UI controls from other threads?

把你所有的UI東西回到主線程中,讓我們知道問題是否仍然存在。

+0

爲什麼我們不應該在一個線程上創建第一個表單而在另一個線程上創建第二個表單? – user186246 2012-08-17 07:18:57

+0

初始窗體在主線程上創建,但它正在主線程以外的新線程上運行。 – user186246 2012-08-17 07:40:02