|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2021/5/4 22:50:50 |
标题: |
|
加入我的收藏 |
楼主: |
设计了一个播放软件,想要得到的效果是,通过在主程序中点击button来创建多个form,每个form上能播放独立的视频内容。第一反应是多线程,但是看到有人说VCL不允许在线程中创建窗体,所以有点迷糊,想要询问下大家的意见。
----------------------------------------------
- |
作者: |
gmxyb (gmxyb) |
★☆☆☆☆ |
-
|
普通会员 |
|
2021/5/5 11:50:57 |
1楼: |
是这样的。一般UI库都不支持多线程,包括MFC。
如果你功力够,不想受多线程限制,你可以用Windows原生API自己创建窗体。。
另外还有个简单粗暴的办法,就是把播放界面做成一个独立的exe,用一个主控程序通过IPC通讯控制和管理。
----------------------------------------------
-
|
作者: |
|
2021/5/5 14:11:47 |
2楼: |
这种不需要多线程,按一下按钮你就创建一个就行了啊.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
|
作者: |
|
2021/5/5 16:59:56 |
3楼: |
回楼上,当我打开10个以上窗体的话,就会很卡,这个怎么破呢?
----------------------------------------------
-
|
作者: |
|
2021/5/5 20:06:55 |
4楼: |
估计其他播放器同时播放10个视频也会卡,视频毕竟是要消耗CPU的
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier 缘在上海
|
作者: |
|
2021/5/6 9:20:47 |
5楼: |
ms并不禁止线程创建ui,不过想跨平台倒是不能在子线程里操作ui. 你可以用postmessage来模拟异步创建窗口。
至于说播放视频,那你可以调用opengl开启硬件加速来播放,这样可以有效降低cpu利用率。
----------------------------------------------
--
|
作者: |
|
2021/5/6 11:37:28 |
6楼: |
1. 你要在线程中创建窗体,也是可以的。只不过,你要另外做一些工作,比如给那个窗体指定消息处理函数等等。细节我也不记得了,网上可以查到;
2. 完全没有必要。创建窗体这种事情,要么程序启动时创建,要么用户需要时创建,反正不会在程序运行期经常创建释放再创建,多线程去做,没有太多意义。需要处理的是创建的时机。往往是时机没处理好导致用户感觉不好。
----------------------------------------------
-
|
作者: |
|
2021/5/6 11:48:48 |
7楼: |
多线程的UI估计要自己封装了 每个线程都要有自己的消息循环,这个快可以参考Application的消息循环。 操作FORM/UI的动作都要在自己所属的线程里面做。 Delphi里面的Application是全局的,但它仅仅对应主线程的UI,很多操作要避开它。 若干年以前曾经做过一个多线程,多窗口的播放器,每个FORM对应一个独立的线程。当时窗口不多,也就4个线程,所以测试主观感受和单线程的差不多。最后多线程仅仅作为一个可选项,由配置可以切换单线程还是多线程。 如果楼主是很多线程很多窗口同时播放,可能单线程还是多线程体感上会有所差异吧。
----------------------------------------------
武稀松http://www.raysoftware.cn
|
作者: |
|
2021/5/6 22:02:00 |
8楼: |
好吧
----------------------------------------------
-
|
作者: |
|
2021/5/7 10:30:55 |
9楼: |
播放视频的窗口,如果那个最后画图到窗口里面是自己做,那:
1. 窗口的创建本身还是用主线程; 2. 最后画图的那个动作之前的动作可以是线程,但最后画图的操作,需要同步到主线程。 3. 我做过64个窗口同时显示视频的,没有任何问题,最终行不行看 CPU 的解码能力够不够。因为我的视频的最终显示,是采用了 DirectShow 提供的 Render,如何画图,由 DirectShow 去解决了。显卡好的,它可以利用显卡加速,效率会高很多。显卡不好的,确实就慢了。但不管快慢,程序都运行正常不会有问题。
PS: 在 Delphi 底下使用 DirectShow 其实非常简单,只不过资料很少,买得到的关于 DirectShow 的书又写得很烂让人无法理解。微软官方的文档也不讲概念只讲做法,也不好理解。
PS:Delphi 底下使用 DirectShow,有一套开源控件:DsPack,非常不错。我就是用它来实现的。
----------------------------------------------
-
|
作者: |
hs_kill (lzl_17948876) |
★☆☆☆☆ |
-
|
普通会员 |
|
2021/5/7 14:02:00 |
10楼: |
视频播放底层本身就是多线程的 DX视频播放时需要传入一个窗体句柄, DX后台会在这个窗体范围上播放视频
所以多线程播放根本不需要你去操心, DX自带处理了 窗体创建根本用不上多线程, 你顺序创建N个窗体 然后吧窗体句柄扔给DX接口播放就行了
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
|
作者: |
|
2021/5/7 17:27:38 |
11楼: |
楼上说得没错。DirectShow 自己有内部的线程负责视频数据处理,一直到显示。整个过程不用自己的代码干预。
不过,我的程序稍微复杂一点点,视频数据是我自己用 Indy 控件从网络获取。这里我使用了多线程获取数据,然后再通过一个自己写的 Push Source Filter 推给 DirectShow 使用,因为 DirectShow 有自己的线程,所以这里是两个线程交换数据,需要考虑加上临界区或者读写缓冲区。
只不过,窗口的创建,实在是没必要使用线程来创建。这里说的都是视频数据处理和显示才可能碰到多线程。
----------------------------------------------
-
|
作者: |
|
2021/5/7 20:54:22 |
12楼: |
对不起各位,貌似我漏了一个关键的语句。我所说的播放窗口,其实就是通过类似webbrowser控件的网页播放器来播放相关视频内容,而非涉及到Dx方面的东西
----------------------------------------------
-
|
作者: |
|
2021/5/7 21:13:42 |
13楼: |
亲,最简单的办法就是采用B/S架构,在浏览器中播放视频,想要啥效果也啥效果, 程序在Windows/Linux/Mac都能跑,桌面与手机都能看。
----------------------------------------------
-
|
作者: |
|
2021/5/8 11:22:46 |
14楼: |
网页播放器也是要有开源代码才行的。不是简单的在网页里面写一个 HTML5 的 video 标签就可以的。
----------------------------------------------
-
|
作者: |
|
2021/5/8 21:14:12 |
15楼: |
回楼上,有代码的。我是用aplayer这个控件来实现的。
----------------------------------------------
-
|
|