请问用多线程分屏播放视频,程序响应太慢的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 norlon
  • 开始时间 开始时间
N

norlon

Unregistered / Unconfirmed
GUEST, unregistred user!
做一个远程视频监控的软件,要求能将不同节点传来的视频分屏显示。现在用多线程来实现,即一个视频用一个线程。在操作VCL时用synchronize来同步,但是发现即使只有一个线程,也会使得界面响应变慢,如果有两个线程,则变慢十分明显,请问这类问题该如何解决,谢谢!
 
做一个远程视频监控的软件,要求能将不同节点传来的视频分屏显示。现在用多线程来实现,即一个视频用一个线程。在操作VCL时用synchronize来同步,但是发现即使只有一个线程,也会使得界面响应变慢,如果有两个线程,则变慢十分明显,请问这类问题该如何解决,谢谢!
 
好,帮顶


--------签名档---------------------------

比肩国内顶尖源码下载站点 -> 源码我爱你

http://www.source520.com
http://www.source520.net
80G源码电子书免费免注册下载,大量精辟技术文档库随时更新
******************************************************************
附:为了站点持续发展,现有本站近年来收藏的大量大型商业源码低价出售,
详情请进入以下链接查看:
http://www.source520.com/building_delphi.htm

浏览商业代码请从如下URL进入查看实物:
1.商业源码库1: ftp://source520see3:browse@61.152.199.245/
2.商业源码库2: ftp://source520see2:browse@61.152.199.245/
 
多线程播放时,最好用window api 创建多线程。效果会更好。
还有,你是用什么方式来播放的呢? DirectX?
我是有DirectX来弄的,效果很好。播放的很流畅的
 
不好意思,后来发现程序响应并没有变慢,是我自己调试方法的问题:(
我想再问个小问题:一个程序最多可以支持多少个线程,或者一台2.0G,256M的机子可以支持多少个线程的程序。谢谢!
 
支持多少个线程要看你的线程都是处理什么工作的了,要是就是建立一个空的,什么事都不干的线程,那就很多了。但是从常规上来说,一个软件最好不要超过10个线程同时处理,因为线程多了也未必是好事,这种情况下可以拆分成几个系统来处理。因为线程多了,系统给进程分配的资源可能不够用。不过你的配置开10个线程应该没有问题的。
 
那如果需要大于10个线程的话(100个可以吗),是否需要用到线程池?线程池对于提高效率,减少开支有多大效果呢?
 
这个东西你要实际测试,但是不要开太多了。这方面没有发言权。至于线程池,我的理解是本来就有的一组线程,当需要的时候,就从线程池里面选择一个线程来处理,如果线程池里面的线程都有自己的工作,都在处理的时候,那就只能等待了,等待空闲的线程。我想这个是为了避免随意的无限制的新建线程的吧。
 
对线程池我不太理解。按你的意思是说线程池里维护着一堆线程,他们不被删除,当需要时使用他们,以减少创建和删除线程时需要的开销;
不知道我的理解是否正确
 
他们会被删除和创建的,只是线程池应该有一个最大线程数控制。当然我自己没有用过,是从字面上理解。因为如果有100个线程的线程池,很多时间只有一半的线程处于使用状态,那另外一半就是浪费资源了,创建了不使用。所以你说的有道理,更正我上面的错误理解!
 
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在线程创建后自动启动这些任务。
 
有许多应用线程的程序在等候事件的休眠状态中消耗了大量时间,Other threads may enter a sleeping state only to be awakened periodically to poll for a change or update status information. Thread pooling enables you to use threads more efficiently by providing your application with a pool of worker threads that are managed by the system. 至少一个线程监控着线程池中排列的所有wait操作状态。当一个等候操作执行完毕,线程池中一个worker线程就会执行相应的callback函数。

  你也可以把一些不需要wait操作的工作项添加到线程池中。要请求线程池中一个线程可以处理一个工作项的话,可以调用QueueUserWorkItem function. 该函数需要一个线程被选中时需要执行的函数作为参数。排队候,就没有办法撤销一个工作了。
  Timer-queue timers and registered wait operations 同样使用线程池. 他们的回调函数被排列到线程池中,你也可以通过 BindIoCompletionCallback 函数post异步I/O操作。异步I/O完成时,就会被线程池中一个线程执行callback函数。
  线程池是在第一次调用QueueUserWorkItem or BindIoCompletionCallback时创建的,或者一个timer-queue timer or registered wait operation queues a callback function.默认情况下,线程池中可创建的线程数为500,每个线程应用默认栈大小并按默认优先级执行。
  线程池中有两种类型的worker线程: I/O and non-I/O,I/O worker线程wait时有一个alertable wait状态,排队到I/O worker threads中的工作项可看为异步过程调用 (APC).
  A non-I/O worker thread waits on I/O completion ports,使用非I/O worker threads比使用I/O worker threads更有效率些。一次,你应该尽可能的使用非I/O worker threads。 如果仍有异步I/O请求未完成, I/O及non-I/O worker threads都不会exit。两种类型的线程都可被用来发起asynchronous I/O completion requests. 然而,如果异步I/O请求完成需要花费很长时间,就应当避免放置到非I/O worker threads中。
  要使用线程池,调用的工作项及所有函数必须保证是线程池安全的.安全的函数不应该假定其执行线程是dedicated or persistent的。通常情况下应当避免使用 thread local storage ,并避免把一个需要持久稳定线程的异步调用排队,如RegNotifyChangeKeyValue 函数。然而这些函数可以利用QueueUserWorkItem 的WT_EXECUTEINPERSISTENTTHREAD选项排队为一个持久稳定的worker thread。
 
谢谢你了,这方面我得先看看书。
 
多人接受答案了。
 
不好意思,加错分了,以为是按回答次序排名的,原来是按字母顺序排的。见谅
 
后退
顶部