我有个程序,在程序启动后后台有好几个线程同时运行,当检测到程序在传输数据时想在右下脚弹出个form来替代messagebox,像msn那样的消息提示.
但是我发现在线程中不好弄,有没哪位大哥帮我下,谢谢了。
调试环境:
vista utimate + vs2005(team,sp1).

解决方案 »

  1.   

    看一下BackGroundWorker控件的使用,起的线程不能直接调有UI线程.用这个控件可以让线程通知UI线程去显示一个窗体.
      

  2.   

    我用的就是backgroundWorker.虽然也来个form,但和普通的show出来的完全不一样,而且还有一大片黑的,显示不出来.
      

  3.   

    弹出的窗体里面没有和别的窗体交互的地方.
    只是用了两个timer分别来控制淡入和淡出.
      

  4.   

    timer也是一个线程,会不会有些问题?要不把TIMER换掉,自己写个线程去控制淡入淡出?
      

  5.   

    而且是两个TIMER?这两个TIMER之间会不会有影响?
      

  6.   

    自己再写个线程?
    再那个弹出的form中写么?
    不过好像再那个弹出的form中不能做任何事了,连显示一个label,只不过事动态赋直,然后出来的也是一个黑块。
      

  7.   

    那两个timer之间不会有影响的,是一个timer结束后才激活另一个timer的。
      

  8.   

    关键在这里:生成Form必须在UI的主线程中,如果不是的话,必须用Invoke或BeginInvoke去同步到那个线程上.
      

  9.   

    在线程中用invoke方法调用委托来显示窗口!Form.BeginInvoke(delegate...)
      

  10.   

    用BackGroundWorker就可以不用BEGININVOKE了.可能还是结构之间有些问题...
      

  11.   

    用Invoke或BeginInvoke
    http://msdn2.microsoft.com/zh-tw/library/0b1bf3y3(VS.80).aspx
      

  12.   

    if (InvokeRequired)
    {
        BeginInvoke(new ReplyCompletedDelegate(PerformReply), new object[] { result });
    }
      

  13.   

    在用Invoke或BeginInvoke去同步到主线程上的时候,重要的是要找到一个在主线程上生成的Form或 Control, 然后用它的Invoke或BeginInvoke:
    private delegate void OpenFormDelegate();//在后台数据线程中调用此function.
    //假设myControl 是一个主线程中生成的Control 或 Form
    private void OpenForm()
    {
        if (myControl.InvokeRequired)
            myControl.Invoke(new OpenFormDelegate(DoOpenFormJob));
        else
            DoOpenFormJob();}private void DoOpenFormJob()
    {
        try
        {
         //弹出一个Form
        }
        catch (ThreadAbortException Err)
        {
        }
    }
      

  14.   

    采用委托或事件的方式我觉得用事件的方式是最好的,通知主线程,然后在事件代码中写出显示FORM的代码