解决方案 »

  1.   

    把数据处理放到单独线程中去。
    在线程中凡是设计UI的,需要使用委托来处理。
    给个简单的示例:public class MyForm : System.Windows.Forms.Form {
                
        //UI 元素
        private Label lblStatus;
        
        private ProgressBar progressBar1;    //Delegate
        private delegate void MyProgressEventsHandler(
            object sender, MyProgressEvents e);    
         private void UpdateUI(object sender, MyProgressEvents e) {
            lblStatus.Text = e.Msg;
            myProgressControl.Value = e.PercentDone;
        }   //ShowProgress 现在可以记录为可从任何线程调用的公共方法。
        public void ShowProgress(string msg, int percentDone) 
       {
    if(InvokeRequired)
    {
       System.EventArgs e = new MyProgressEvents(msg, percentDone);
               object[] pList = { this, e };           BeginInvoke(new MyProgressEventsHandler(UpdateUI), pList);
    }
    else
            {
        UpdateUI(this, new MyProgressEvents(msg,
                PercentDone)); 
            }
           
        }     private void btnStart_Click(object sender, EventArgs e)
         {
          //启动线程
          Thread t = new Thread(new ParameterizedThreadStart(RunsOnWorkerThread));
          t.IsBackground = true;
          t.Start(input);
         }    //线程执行函数
        private void RunsOnWorkerThread() 
        {
            int i = 0;   
            while(...) //loop      
            {  
              DoSomethingSlow();
              ShowProgress("test",i);
              ++i;
            }
        }
       
    }
      

  2.   

    可以把数据放到queue中,在写和读queue的时候加锁
    就可以了
      

  3.   

    可以把数据放到queue中,在写和读queue的时候加锁
    就可以了这样的话对程序的性能影响大不大?
      

  4.   

    关键是楼主的多线程没处理好
    将录音线程独立出来吧,通过queue在窗体和录音线程间传递数据,别忘加锁。
    其他的绘图什么的都在Form中实现好了。
    还有,你是通过什么录音的?
    DirectX录音是两块缓冲器交替录音,一块缓冲器满的时候有消息通知的,这样你都不用使用多线程,在消息处理中处理数据就可以了。
      

  5.   

    可以把数据放到queue中,在写和读queue的时候加锁
    就可以了这样的话对程序的性能影响大不大?
    看处理数据量来定影响,如果每秒处理的数据量很小,
    如几百笔,那没有影响。
      

  6.   


    谢谢你的回复 现在我把我的问题抽象成几行简单的代码  发一下希望能给小弟解决一下啊  主要就是委托这个地方还不是太会用
    FORM 类里面的代码如下public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            Run R = new Run();
            private void button1_Click(object sender, EventArgs e)
            {
                R.star();
            }
            public void draw()
            {
                Graphics g = panel1.CreateGraphics();
                Pen p = new Pen(Color.Red, 2);
                g.DrawLine(p, 10, 40, 20, 60);
            }
        }
    下面是Run这个类class Run
        {
            public void star()
            {
                loop();
            }
            private void loop()
            {
                while (true)
                {
                    int i = 0;
                    i = i + 1;
                    Form1 f = new Form1();
                    Thread t = new Thread(f.draw);
                    t.Start();
                }
            }
        }我的像在界面的panel上面画图 但是就是画不上去
      

  7.   


    你好,我是在读取缓冲区内容的时候,调用forn中的画图方法的,其实不需要另起一个线程开始这个方法也可以,我只是怕会录音阻塞。
      

  8.   


    谢谢你的回复 现在我把我的问题抽象成几行简单的代码  发一下希望能给小弟解决一下啊  主要就是委托这个地方还不是太会用
    FORM 类里面的代码如下public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            Run R = new Run();
            private void button1_Click(object sender, EventArgs e)
            {
                R.star();
            }
            public void draw()
            {
                Graphics g = panel1.CreateGraphics();
                Pen p = new Pen(Color.Red, 2);
                g.DrawLine(p, 10, 40, 20, 60);
            }
        }
    下面是Run这个类class Run
        {
            public void star()
            {
                loop();
            }
            private void loop()
            {
                while (true)
                {
                    int i = 0;
                    i = i + 1;
                    Form1 f = new Form1();
                    Thread t = new Thread(f.draw);
                    t.Start();
                }
            }
        }我的像在界面的panel上面画图 但是就是画不上去Run类写的有问题,数据和界面要分离,
    在线程中启动form 的设计有问题。更何况,run函数写在while里面,看不到while终止或者跳出的处理,也看不到sleep,
    一旦运行,就和病毒一样,一直把内存消耗完挂掉为止。