有一个窗口,里面通过ThreadPool.QueueUserWorkItem(new WaitCallback(LoadPlayer));
加载多个播放器,然后还加载一个滚动文字的窗口(包含timer线程);而每个播放器又有很多工作,并且还会包含
ThreadPool.QueueUserWorkItem创建的其他子工作线程,当它们运行时,就出现了卡壳的现象,
所以我的问题是在怎么消除卡壳的现象,
特别是在ThreadPool.QueueUserWorkItem创建的其他子工作线程来读写播放列表,切换节目单,分析播放的输出时

解决方案 »

  1.   

    我想问ThreadPool.QueueUserWorkItem创建的线程要怎么被控制,
    就像窗口里player1和player2,都用
    ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessPls), e);
    分别创建新节目单 pls1 和 pls2 
    来播放,这时会造成滚动文字的窗口timer线程停顿(像是主线程的时间片被抢先占用了),player1和player2从线程池创建的线程又会互相争用主线程的资源似的
      

  2.   

    用异步线程,调用子线程的时候,最好lock 避免资源竞争lock(this)
    {
     子线程
    }委托线程
    delegate void SetVisibleDelegate();
            private void uprss()
            {
                this.BeginInvoke(new SetVisibleDelegate(运行函数));}
    ......
      

  3.   

    你的队列线程好似也是 UI 线程,winform 通常只有一个 UI 线程, 
    若要支持多个 UI 线程, 
    你要做的还有很多,消息泵要独立.
      

  4.   


    我还没用到消息泵,只是简单的使用ThreadPool.QueueUserWorkItem创建线程,异步的调用做某件事就是主界面form传节目单表数据给播放器form或字幕窗口等子窗口
    主界面form。control。add(子窗口)
    然后子窗口自己做自己的事,本来想是这种思路
    但发现因为子窗口的所有操作还是在主窗口的线程里,所以出现了抢cpu资源,造成程序运行卡的现象如果朋友们有好的思路,多指点下或是举个例,谢谢先!
      

  5.   

    合理调整你的函数,把占用时间多的工作放到后台线程去完成,不要所有事情都挂在UI线程执行Thread.BackgroundWorker = true;
      

  6.   

    也就是说,数据的处理,都在后台,仅仅在一切处理就绪,需要通知UI改变内容时,才访问UI
      

  7.   

    我现在把代码做大改动了
    播放器用MPlayer,降低它的进程优先级,单独运行字幕窗口,不太卡了还是没理解透一点:
    ThreadPool.QueueUserWorkItem启动的线程去异步做某一件事情,
    AutoResetEvent/ManualResetEvent 或同时使用lock,怎么能够达到线程排队工作的效果;
    http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html
    看上面的文章依然理解不透!
    比如
    我要事件按顺序 1,2,3....工作
    ThreadPool.QueueUserWorkItem启动却是 2,1,3.....工作
    所以想到AutoResetEvent/ManualResetEvent 或同时使用lock
      

  8.   

    你尝试使用进程自带的默认线程池看看,自带的那个线程池帮我们优化了好多东西,当然也可以去修改它的设置。每个进程都有一个默认的线程池,使用委托的BeginInvoke方法执行的过程都是在默认线程池中执行的。
      

  9.   

    http://hi.baidu.com/swaulxf/blog/item/ebe1601e498dd8e81bd576b2.html#0
    这个讲的不错。