多线程问题

li_rui_1220 2016-03-05 11:26:59
加精
我这个程序是图像处理的,要求处理速度达到120帧每秒
但是图像刷新时间是不可能达到120帧每秒
目前的做法是这样的
我建立两个线程,其中一个是计算图像,时间大概需要3ms
其中一个是显示图像,整个显示大概需要15ms。


现在发现速度仍然达不到120帧每秒,感觉程序只要已进入显示图像似乎就必须执行完一样。


我想知道一个Windows是采用时间片轮转法吗?我怎么觉得程序进入一个需要执行比较长时间的线程就会卡住不出来呢。

我这样想对吗?或者怎样可以让线程让出CPU呢
...全文
2534 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
虎背人腰_ 2017-10-10
  • 打赏
  • 举报
回复
不错,还是蛮好的~
FD_2013 2016-04-27
  • 打赏
  • 举报
回复
应该是线程异步同步的问题吧,还有就是如果是对话框,这时你子线程还没执行完的时候,对话框是处于阻塞状态的,最好手动轮询,类似于定时器那种
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
引用 31 楼 zjsegzhf 的回复:
引用 26 楼 nj_dobetter 的回复:
撰写于1993年,好文啊! [quote=引用 16 楼 zhao4zhong1 的回复:] Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
虽然我看不懂, 但是我要假装我也看得懂。 撰写于1993年,好文啊![/quote] 虽然我只会粘贴,但是我要假装我看得懂。 拷贝于2005年,好文啊!
  • 打赏
  • 举报
回复
没那么复杂,不用建立多线程,计算图像仍然在你的像机回调函数里进行,这个没问题,另外用多媒体计时器建立一个40ms的计时器事件(timeSetEvent),在它的回调里处理显示。这是标准的多媒体应用的处理套路,多线程处理高速数据接收、显示是不行的,因为线程的执行间隔不能保证,可能一次轮转下来几百毫秒过去了。
米拉小胖子 2016-04-27
  • 打赏
  • 举报
回复
引用 26 楼 nj_dobetter 的回复:
撰写于1993年,好文啊!
引用 16 楼 zhao4zhong1 的回复:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
虽然我看不懂, 但是我要假装我也看得懂。 撰写于1993年,好文啊!
列子汤问 2016-04-26
  • 打赏
  • 举报
回复
li_rui_1220 2016-04-26
  • 打赏
  • 举报
回复
引用 21 楼 mqdsg 的回复:
[quote=引用 20 楼 li_rui_1220 的回复:] 我目前的解决办法是,根据我的计算结果将图像的轮廓用CDC画出来。这样用时很少,直接在回调函数中运行。 效果还行
请问现在达到多少帧了呢?[/quote] 目前测试可以达到120帧
赵4老师 2016-03-15
  • 打赏
  • 举报
回复
酒越陈越香!
Poopaye 2016-03-15
  • 打赏
  • 举报
回复
你先确定显示器能支持120帧吗?
nj_dobetter 2016-03-14
  • 打赏
  • 举报
回复
撰写于1993年,好文啊!
引用 16 楼 zhao4zhong1 的回复:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
边走边瞧 2016-03-12
  • 打赏
  • 举报
回复
用GDI画图,且120FPS,这个要求有点不现实,毕竟GDI只是用来处理应用程序的显示,不是用来搞游戏的。实际运用情况比较复杂,图像大小、显卡性能等等都是问题,LZ想过怎么解决没有?
dunewer 2016-03-11
  • 打赏
  • 举报
回复
掉了一行: CBMP.Save ("Pic_"& cStopWatch.ElapsedMilliseconds & "ms.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
dunewer 2016-03-11
  • 打赏
  • 举报
回复
能达到图像设备的最大传输速率,120帧率不是问题。
dunewer 2016-03-11
  • 打赏
  • 举报
回复
sub Main '图像捕捉线程 dim Thd_WHM_PicCap = New Threading.Thread(AddressOf WHM_Pic_Cap) Thd_WHM_PicCap.Start() end main ''' <summary> ''' 捕获波高图像 ''' </summary> Sub WHM_Pic_Cap() On Error GoTo ErrHand '使用秒表来计时,防止系统的触发时间机制 Dim cStopWatch As New Stopwatch cStopWatch.Start() Dim CBMP As Bitmap Do '全局变量,退出循环 If Not IsWHMPicCapturingStatue Then Exit Do '***** 采集图像 ****** ‘WHM_WDMIAT 图像工具的.net对象 WHM_WDMIAT.MemorySnapImage() CBMP = WHM_WDMIAT.ImageActiveBuffer().Bitmap Loop ExitHand: Return ErrHand: Dim ErrString = Date.Now & " 错误" & Err.Number & ":" & Err.Description : TsslMain.Text = ErrString Resume Next End Sub
在飞的特拉斯 2016-03-10
  • 打赏
  • 举报
回复
引用 20 楼 li_rui_1220 的回复:
我目前的解决办法是,根据我的计算结果将图像的轮廓用CDC画出来。这样用时很少,直接在回调函数中运行。 效果还行
请问现在达到多少帧了呢?
super_admi 2016-03-09
  • 打赏
  • 举报
回复
14楼的办法是正确的,不能将Draw放入回调函数中调用,而应该另使用一个线程来执行Draw,这样,你的计算只要3ms,完全满足要求。
引用 13 楼 li_rui_1220 的回复:
显示函数是相机的库函数实现的,这个函数需要执行15ms,函数名为Draw 相机函数提供了回调函数,将图像指针传出来,将相机的帧率设为120,即每8.3ms自动调用一次 原来程序全部在回调函数中处理,即回调函数执行时间为15+3=18ms,所以回调函数就不能每8.3ms(120帧/秒)执行一次 导致将帧率拖到55帧/秒 现在我就是把显但用一个线程显示,想通过此方式保证回调函数每8.3ms执行一次(即达到120帧/秒) 但是我的显示线程执行Draw的时候需要15ms,导致CPU使用权不能切回回调函数,也就达不到120帧/秒
1cctv 2016-03-09
  • 打赏
  • 举报
回复
我的工作环境,1到8路,10-300祯,480P到1944P分辨率的各种组合的实时图像处理. 具体到你的单路图像,可以这样处理. 总原则是主线程既不采集图像,也不处理图像,也不显示图像. 以4线程CPU为例. 可以建立两个图像处理线程p[0],p[1],一个图像显示线程d 1 建立图像缓冲区如100个 2 你的像机回调函数 a 负责把图像复制到缓冲区. b PostMessage缓冲区编号或地址到图像处理线程,比如可以根据祯号的奇偶分别Post到p[0],p[1]. 3 a p[0],p[1]开始处理缓冲区中的图像. b p[0],p[1]处理完图像,PostMessage缓冲区编号或地址到线程d 4 线程d挑祯显示 具体还要看实时性要求,如果要求每祯图像处理后必须实时出控制信号, 那么两祯并行处理可能不能满足实时性要求,可以考虑把一祯图像分成 两半,p[0],p[1]各处理一半,来提高性能. 如果图像处理部分是轻载的,图像处理线程p就建一个. 以上方法不涉及在一个线程中开启多核优化(OpenMP)的事儿. 关于线程的应用,参考 http://bbs.csdn.net/topics/360040231
cattpon 2016-03-09
  • 打赏
  • 举报
回复
learning~
li_rui_1220 2016-03-09
  • 打赏
  • 举报
回复
我目前的解决办法是,根据我的计算结果将图像的轮廓用CDC画出来。这样用时很少,直接在回调函数中运行。 效果还行
赵4老师 2016-03-08
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
加载更多回复(15)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧