关于C#多线程绘制问题 C#GDI绘制Bitmap多线程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 timer其实在线程里回调的事件你加了lock,一次没有处理完,下一次会阻塞住,排队等待执行,造成线程越来越多,都在阻塞而如果遇到lock直接跳出,当然会丢帧不能把大图切成小块,多线程同时进行绘制吗 用timer,那么每次进入timer,先停掉timer,然后处理,处理完再打开timer用线程,cpu高,估计你代码问题,耗时的操作有没有放到线程里 其实就是“跳帧”的概念如果你一秒30帧,那就要求1/30秒内必须处理完一次重绘,如果处理不完,就要跳过下一次重绘 object lockObject = new object(); bool ticking = false; void timer_Tick(object sender, EventArgs e) { lock (lockObject) { if (ticking) { return; } ticking = true; } Task.Run(...); ticking = false; } 你没说绘制是用的什么办法,还有把bitmap画到界面上的方式。如果你是用LockBits拿到了bitmap对应的非托管内存,那么是可以对这块内存并发访问的(当然前提是你的算法不会冲突)。追求效果的话也不应该在timer触发的时候才画好当前帧。应该是预先画好后面的帧,定时画到界面上。如果只是透明度的改变,不是太大的图片应该也不需要多线程绘制。之前解决别的问题的时候比较两个3200*1200的图片画到第三张图上去debug方式也就80ms。一般流畅动画效果画到25帧,40ms一帧就可以了。 我的绘制方法就是using(Graphics g = Graphics.FromImage(_canvas)) 内存那个就不考虑了 这个问题我大概解决了 最后解决方案就是传递一个线程同步的上下文(SynchronizationContext)每次 进行绘制刷新的时候把消息同步到UI线程来完成 也不需要锁定 不知道低层实现机制是什么 但是解决问题了... C#如何生成可编辑的PDF文件,并且如何从PDF文件读取数据保存至数据库 正则取(..../)之间的内容,在线等... 关于数据库实时更新提示 用AxWindowsMediaPlayer制作音频播放器时,如何设置它的视觉效果 Vs2005在运行后,怎样实现拖动打印预览参数? DataGrid响应键盘事件问题! vs2010 “LC.exe”未能运行。参数错误。 WPF中使用webBrowser控件不能播放Flash VS不能进行调试 自建一个datatable的问题!!! 新手求教:为什么我的循环有问题? 从服务器下载安装包后,如何自动安装(静默安装?)
你加了lock,一次没有处理完,下一次会阻塞住,排队等待执行,造成线程越来越多,都在阻塞
而如果遇到lock直接跳出,当然会丢帧不能把大图切成小块,多线程同时进行绘制吗
如果你一秒30帧,那就要求1/30秒内必须处理完一次重绘,如果处理不完,就要跳过下一次重绘 object lockObject = new object();
bool ticking = false; void timer_Tick(object sender, EventArgs e)
{
lock (lockObject)
{
if (ticking)
{
return;
}
ticking = true;
} Task.Run(...); ticking = false;
}
如果你是用LockBits拿到了bitmap对应的非托管内存,那么是可以对这块内存并发访问的(当然前提是你的算法不会冲突)。
追求效果的话也不应该在timer触发的时候才画好当前帧。应该是预先画好后面的帧,定时画到界面上。如果只是透明度的改变,不是太大的图片应该也不需要多线程绘制。之前解决别的问题的时候比较两个3200*1200的图片画到第三张图上去debug方式也就80ms。一般流畅动画效果画到25帧,40ms一帧就可以了。