DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wsiqin
今日帖子: 6
在线用户: 8
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 zhouying (zy) ★☆☆☆☆ -
盒子活跃会员
2021/5/4 22:50:50
标题:
问一个关于多线程创建窗体的问题 浏览:257
加入我的收藏
楼主: 设计了一个播放软件,想要得到的效果是,通过在主程序中点击button来创建多个form,每个form上能播放独立的视频内容。第一反应是多线程,但是看到有人说VCL不允许在线程中创建窗体,所以有点迷糊,想要询问下大家的意见。
----------------------------------------------
-
作者:
男 gmxyb (gmxyb) ▲▲▲▲▲ -
注册会员
2021/5/5 11:50:57
1楼: 是这样的。一般UI库都不支持多线程,包括MFC。

如果你功力够,不想受多线程限制,你可以用Windows原生API自己创建窗体。。

另外还有个简单粗暴的办法,就是把播放界面做成一个独立的exe,用一个主控程序通过IPC通讯控制和管理。
----------------------------------------------
-
作者:
男 doersoft (XMG-ZY) ★☆☆☆☆ -
普通会员
2021/5/5 14:11:47
2楼: 这种不需要多线程,按一下按钮你就创建一个就行了啊.
----------------------------------------------
delphi Flutter&Vue|golang rhinoslink
作者:
男 zhouying (zy) ★☆☆☆☆ -
盒子活跃会员
2021/5/5 16:59:56
3楼: 回楼上,当我打开10个以上窗体的话,就会很卡,这个怎么破呢?
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/5/5 20:06:55
4楼: 估计其他播放器同时播放10个视频也会卡,视频毕竟是要消耗CPU的
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2021/5/6 9:20:47
5楼: ms并不禁止线程创建ui,不过想跨平台倒是不能在子线程里操作ui.
你可以用postmessage来模拟异步创建窗口。

至于说播放视频,那你可以调用opengl开启硬件加速来播放,这样可以有效降低cpu利用率。
----------------------------------------------
--
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/5/6 11:37:28
6楼: 1. 你要在线程中创建窗体,也是可以的。只不过,你要另外做一些工作,比如给那个窗体指定消息处理函数等等。细节我也不记得了,网上可以查到;

2. 完全没有必要。创建窗体这种事情,要么程序启动时创建,要么用户需要时创建,反正不会在程序运行期经常创建释放再创建,多线程去做,没有太多意义。需要处理的是创建的时机。往往是时机没处理好导致用户感觉不好。
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2021/5/6 11:48:48
7楼: 多线程的UI估计要自己封装了
每个线程都要有自己的消息循环,这个快可以参考Application的消息循环。
操作FORM/UI的动作都要在自己所属的线程里面做。
Delphi里面的Application是全局的,但它仅仅对应主线程的UI,很多操作要避开它。
若干年以前曾经做过一个多线程,多窗口的播放器,每个FORM对应一个独立的线程。当时窗口不多,也就4个线程,所以测试主观感受和单线程的差不多。最后多线程仅仅作为一个可选项,由配置可以切换单线程还是多线程。
如果楼主是很多线程很多窗口同时播放,可能单线程还是多线程体感上会有所差异吧。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 zhouying (zy) ★☆☆☆☆ -
盒子活跃会员
2021/5/6 22:02:00
8楼: 好吧
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
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/
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/5/7 17:27:38
11楼: 楼上说得没错。DirectShow 自己有内部的线程负责视频数据处理,一直到显示。整个过程不用自己的代码干预。

不过,我的程序稍微复杂一点点,视频数据是我自己用 Indy 控件从网络获取。这里我使用了多线程获取数据,然后再通过一个自己写的 Push Source Filter 推给 DirectShow 使用,因为 DirectShow 有自己的线程,所以这里是两个线程交换数据,需要考虑加上临界区或者读写缓冲区。

只不过,窗口的创建,实在是没必要使用线程来创建。这里说的都是视频数据处理和显示才可能碰到多线程。
----------------------------------------------
-
作者:
男 zhouying (zy) ★☆☆☆☆ -
盒子活跃会员
2021/5/7 20:54:22
12楼: 对不起各位,貌似我漏了一个关键的语句。我所说的播放窗口,其实就是通过类似webbrowser控件的网页播放器来播放相关视频内容,而非涉及到Dx方面的东西
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲△ -
注册会员
2021/5/7 21:13:42
13楼: 亲,最简单的办法就是采用B/S架构,在浏览器中播放视频,想要啥效果也啥效果, 程序在Windows/Linux/Mac都能跑,桌面与手机都能看。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/5/8 11:22:46
14楼: 网页播放器也是要有开源代码才行的。不是简单的在网页里面写一个 HTML5 的 video 标签就可以的。
----------------------------------------------
-
作者:
男 zhouying (zy) ★☆☆☆☆ -
盒子活跃会员
2021/5/8 21:14:12
15楼: 回楼上,有代码的。我是用aplayer这个控件来实现的。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行15.625毫秒 RSS