2011-05-12 67 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

相关问题