各位大侠,最近遇到一个问题:
程序中对接收到的socket消息进行解析,其中一类消息的解析时需要根据情况弹出一个窗口A,显示接收的消息,并在窗口中更新接收时间的信息;现在我在解析类中声明了一个窗口类的实例,再在接受消息时根据全局参数控制窗口的显示;在没有接收到这类消息的时候窗口只是声明好了,但是从未弹出过;我在想让窗口弹出时使用下面代码,结果发现窗口是出来了,但是程序就此处于忙碌状态,开始还可以把窗口拖动一下,但是拖动后把鼠标放到弹出的窗口上就变成了忙碌状态,无法进行其他的操作;而且,如果弹出窗口被其他窗口遮盖住了,尽管它还在任务栏存在,但是再也点击不出来了。
if (frm.Visible == false)
{
   frm.Visible = true;
}
我尝试过用
frm.show()方法,效果一样最后用杀手锏,新开一个线程,调用application.run(frm)的方法,这下倒是好了!不过在vs2005下调试时又会出现”从不是创建此控件的线程访问它“的提示;我觉得没必要单开一个线程去让窗口显示,那还有什么方法呢?
对windows编程的底层不太懂,请各位高手支招,告诉下这是怎么回事?不胜感激!

解决方案 »

  1.   

    出现这个提示是因为你在线程中访问了不在同一线程中创建的控件。form1.CheckForIllegalCrossThreadCalls=false;这样就不会出现提示,或者使用委托之类的。
      

  2.   

    线程忙着做其他事情,自然没有时间处理界面更新的消息。如果线程是循环着做某一件事,或许可以加个Application.DoEvents();试试。
      

  3.   

    控件只可以在主线程中访问,跨线程,如在工作线程访问。就会出现你说的问题你可以在使用控件的方法中,判断一下invokerequired(所有control都有的属性),如果true就使用
    control的invoke调用此方法,否则直接使用控件如在窗体类中定义一个方法:
    FormVisible()
    {
      if (this.invokerequired)
      {
          this.invoke(FormVisible);
      }
      else
      {
          this.visible = true;
      }}