2011-05-12 79 views
1

首先,我很抱歉,即使有很多給定的主題,可能與我的問題有關,但我無法弄清楚如何解決我的問題..C#使用另一個線程控制窗體,也防止複製窗體

它只是在編碼中使用的大多數單詞對我來說都是新的。 我真的需要你的指導傢伙.. =(

到我的問題..

我有2種形式即時我的項目。 在Form1充當我的登錄屏幕 和窗口2是,如果將打開用戶登錄正確

使用UDP作爲我的連接插座。我做了一個簡單的UDPlistener 一個定時器內(原因是因爲如果我不關閉它,如果那裏有什麼可看,它只是 我的程序掛起IM,並仍然在等待消息

注:我的UDP監聽被這樣

Thread thread1 = new Thread(UDPListener.StartListener); 
thread1.SetApartmentState(ApartmentState.STA); 
Thread.Sleep(100); 
thread1.TrySetApartmentState(ApartmentState.STA); 

thread1.Start(); 

當服務器程序向我發送信號,打開窗口2 現在的問題發生在不同的線程運行..

問題是.. form2出現..但form1沒有隱藏或可見= false; (Form1中需要能夠做到這一點

即時通訊做的時候我嘗試顯示窗口2並隱藏form1的 注意此代碼:還有另外一個問題是(不是很確定)..我發現它只是複製形式

Form1 f1 = new Form1(); 
Form2 f2 = new Form2(); 
f1.Command("009"); 
f1.MiniTicker.Enabled = false; //need to do this, cant do this without putting Form1 f1 = new Form1(); 
Login.TBOption.showTaskBar(); 
TaskbarHide.Taskbar.Hide(); 
f1.CoreAds.Enabled = false; //same here 

f1.Visible = false; 
f1.Hide(); 

f1.Invoke(
(MethodInvoker)(() => 
{ 
new TimerMode().Show(); 
})); 


f1.Invoke(
(MethodInvoker)(() => 
{ 
new MainForm().Hide(); 
})); 

最後請注意:以後我上面運行..在Form1就像收盤代碼,但之後它再次打開......

請幫我解決我的問題。我要完成我的論文項目=(

+0

即時通訊仍然遇到這個問題.. =( – Katherina 2011-05-12 04:46:54

+0

)作爲編碼實踐的一個問題,命名Form1和Form2的形式並不明智,而是給它們一個描述性的名稱,爲什麼不使用LoginForm和MainForm(或者更具描述性的) – Martijn 2011-05-12 14:35:24

回答

0

我要假設第二批代碼是你在第一批創建的線程上執行。如果是這樣的話,那麼大部分的問題出現,因爲你是從輔助線程訪問UI元素。讓我徹底說清楚。你可以從一個工人線程FormControl唯一要做的就是調用InvokeBeginInvoke,這就是它。你絕對不能做任何事情。

  • 你不能調用Form構造函數
  • 你不能設置Form.Visible財產。
  • 您不能撥打Form.Hide
  • 您不能訪問任何與Form有關或包含在Form之內的任何

這值得重複。除了ISynchronizeInvoke方法外,您可以在工作線程的Form引用上使用其他任何東西。如果您嘗試從除主UI線程以外的線程訪問任何UI元素,則您的應用程序將失敗;有時難以預料,有時甚至令人驚歎。

+0

嗨。布萊恩,我真的很感謝你的解釋,即使它有點難過,它不能做到這一點..即時思考現在,我能以其他方式解決這個問題..你認爲我需要改變我的聽衆(udp)我記得它之所以造成這個問題的原因,爲什麼我把這些代碼放在另一個線程中。布萊恩真的很感謝我學習了一些新東西 – Katherina 2011-05-14 01:03:25

相關問題