是这样的,我有两个页面from1和form2,form1里面有个button1
当我点击button1时,用线程的方式打开form2butto1_click事件里面写的代码是:
this.td = new Thread(ThreadOpenForm2);
this.td.Start();ThreadOpenForm2方法里写的是:
form2.ShowDialog();由于form2里面的控件太大了,加载特别慢,所以用线程来做的操作现在的问题是,当我点击button1时,线程开始执行,由于速度很慢,要很久才显示form2,
在显示form2之前如果我又点了一次button1,他就又执行了一次线程,最后系统显示了2个form2,我只要他显示一次。应该怎么锁定线程哦??请各位大侠帮我看看,在此先谢谢了。

解决方案 »

  1.   

    你可以把form先加载了,但是隐藏先,在Button1时让他show出来就行了
      

  2.   

    有没有其他的方法哦,因为我是要传参数的,每次点button时传的参数是不一样的。
      

  3.   

    是否可以加个全局变量来标记form2是否启动
    butto1_click事件里面写的代码
    通过全局变量判断form2是否已经启动,
    如果已经启动就不在开线程
    如果没有启动,就开线程,标记已经打开!form2在关闭时需要更改全局变量的值
      

  4.   

    怎么标记哦??定义一个bool值啊???
      

  5.   

    while (td.IsAlive)
    {}
    或用lock,mutex
      

  6.   

    记录Button1的点击次数解决不了?
      

  7.   


    在问下呢??这个代码是写在那里的哦??button_click事件里面啊??
      

  8.   

    button里
    参考
      

  9.   

    ThreadOpenForm2方法里写button1.Enabled =false;
    form2.ShowDialog();
    button1.Enabled = true;
      

  10.   

    大控件?什么叫大控件?难道是类似于Datagird需要加载很多数据吗?能否发我看看?
    [email protected]
      

  11.   

     这不是一个技术问题
    你只要在butto1_click事件里先把
    button1.Enabled 设置为 false然后在
    form2.ShowDialog(); 
    之后把
    button1.Enabled 设置为 true
    即可
      

  12.   

    楼主试试看把打开窗口线程代码写在
    if(!td.isAlive)
    {
    }
    里面试试看
      

  13.   

    第一,要在form2的show()函数里写事件,这样可以使form2得到显示。
    第二,在form1
      this.td = new Thread(ThreadOpenForm2); 
      this.td.Start(); 
    之后,将form1.button1.Enable=false.
    在form2执行往后将form1.button1.Enable=true(防止跨线程访问即可);
    这样可以防止线程被多次启动。