2011-01-11 54 views
1

我工作的一個C#WinForms應用程序,我希望它能夠流行開一個無模式對話框這將讓重繪,並在同一時間,是互動主窗口/窗體。C#的WinForms子窗體顯示()後沒有得到重繪

主窗口使用的SerialPort和顯示數據傳送計數,它們經由SerialDataReceivedEventHandler不斷增加。

我可以使用ShowDialog(),它似乎以模態方式工作,但主窗口數據計數器凍結,而對話框正在使用,我認爲最終串行緩衝區溢出。我想我想使用Show(),但是如果我這樣做,對話框會出現在屏幕上半繪製,然後不再繪製或交互(如果我拖動另一個窗口跨過它)將不會被繪製或交互。它保持在屏幕上,直到我關閉主應用程序窗口。

也許我應該開始另一個線程,或者有可能的,我只是做了什麼。我通常不會做C#或Windows程序設計(也許你可以告訴。)評論(感謝,評論)後

編輯:

我想,也許大多數事情越來越下任何線程串行接收事件處理器運行被調用。當啓動我的應用程序創建一個類來處理串行端口,其中包括:

com.DataReceived += new SerialDataReceivedEventHandler(SerialRxHandler); 

我寫了關心線程的唯一的代碼是一些功能更新計數器和日誌列表框,我發現了與一些InvokeRequired包裹阻止我獲取有關線程切換的抱怨:

delegate void SetCountDelegate(TextBox tb, int count); 
internal void SetCount(TextBox tb, int count) { 
    // thread switch magic 
    if (InvokeRequired) { 
     BeginInvoke(new SetCountDelegate(SetCount), new object[] { tb, count }); 
    } else { 
     tb.Text = String.Format("{0}", count); 
    } 
} 

所以也許我不應該試圖表明()在此線程的形式。另一個InvokeRequired塊,還是我應該做的事情完全不同?

+0

可以請您發佈您的代碼。你是從UI線程上的串行端口讀取? – 2011-01-11 07:41:04

回答

0

想我會回答自己..

通過評議和一點思維的推動下,我做了一個Invoke()切換到UI線程試圖創建和顯示()我的孩子對話框之前。這工作。