CNDEV
CNDEV.ORG
当前在线
论坛
CBD
程序员情感CBD
程序员见面交流会
CBD开发区
Java/J2ME
.NET/C#
数据库
Delphi/BCB
Visual C
其它
修真养身
中国象棋
纪念日
谈钱太俗,还是投机吧
听音乐
iCosta
资源共享
一隅
好文共赏
看电影看美剧
待定
狗屎
雪域召唤
工作流
专业显摆区
语录
情感
批评与自我批评
爱情故事
发牢骚
看三点区
游戏
CNDEV-CS/WOW
浩宇长空
生活
家有XPH
我爱学英语
美食天地ORG
半调子体育迷
观澳园友邻
搞笑奇文
拍照片
我读书我存在
论坛系统
超级垃圾站
系统建议及BUG
系统测试
中国开发网
: 论坛:
程序员情感CBD
: 贴子 641956
好望角
:
你没同步吧?
[阅读: 382] 2008-06-12 13:39:34
这个方法是非线程安全滴。
相关信息:
在线程里多次反复调用 TBitmap.SaveToStream(AMemoryStream) ,会出现 EOutofResources 异常。
(空) (
pcplayer
[1163]
2008-06-12 12:14
)
你怎么用的?
(空) (
没脾气2x
[329]
2008-06-12 12:30
)
那个 MemoryStream 我重复用,就会出问题。如果每次都临时创建,用完释放,就没问题。但这样一来,创建对象的开销就大了。
(空) (
pcplayer
[523]
2008-06-12 12:31
)
bitmap 不是每次都重新创建,而 MemoryStream 每次都重新创建,跑到 11794 次的时候,出现这个异常。
(空) (
pcplayer
[429]
2008-06-12 13:08
)
如果 MemoryStream 不重新创建,跑到第 9 次就出现这个异常。
(空) (
pcplayer
[389]
2008-06-12 13:10
)
Bitmap 每次都重新创建,MemoryStream 每次都重新创建,跑到 30000 次了,还没出异常。看来想节约资源是不行的了。
(空) (
pcplayer
[443]
2008-06-12 13:19
)
创建用完再释放不就行了?
(空) (
Fish
[366]
2008-06-12 14:12
)
靠,如果设置 bmp 的格式是 PixelFormat := pf24bit;就算每次都重新创建 BMP 和 MemroyStream,也只能跑 400 次就出异常了。
(空) (
pcplayer
[509]
2008-06-12 13:25
)
再次重复,如果不设置 PixelFormat 跑30000次都没出问题,如果设置了,跑到900次时出异常: 无效句柄。
(空) (
pcplayer
[510]
2008-06-12 13:29
)
你没同步吧?
(12字)
(
好望角
[381]
2008-06-12 13:39
)
只在一个线程里调用它,没有涉及到在界面上显示这个 BMP,也没涉及到多个线程同时调用它。所以没做同步。
(空) (
pcplayer
[386]
2008-06-12 13:45
)
这样也是不行滴
(10字)
(
好望角
[396]
2008-06-12 13:47
)
我测试一下加上同步看看。
(空) (
pcplayer
[358]
2008-06-12 13:50
)
如果设置 pf24bit 然后把 bmp.SaveToStream 包在 Synchronize,跑到29次就出现“请求的资源正在使用中”的异常。
(空) (
pcplayer
[404]
2008-06-12 13:53
)
如果不设置 pf24bit,跑到9000多次还没出问题。看来只要不是用 pf24bit,是否同步没啥关系。
(空) (
pcplayer
[435]
2008-06-12 13:56
)
实验结果:在不设置 PixelFormat 的情况下,bmp 是一个所谓的设备依赖的,这时候如果不是每次都创建 bmp 和 Stream,多次后可能出 EOutofResource……
(178字)
(
pcplayer
[525]
2008-06-12 13:49
)
你有没有 FreeImage ?
(空) (
没脾气2x
[372]
2008-06-12 13:58
)
什么是 FreeImage?我只是用了TBitmap 和 TMemoryStream
(空) (
pcplayer
[533]
2008-06-12 15:34
)
不懂delphi,但是出错提示感觉很明显了,就是没有回收资源。没没的意思应该是这个。
(空) (
周星驰
[407]
2008-06-12 15:42
)
嗯,没没提醒我了,可能需要 TBitmap.FreeImage 来释放资源,这样就不用重新创建对象了。另外可能需要 TBitmap.Dormant,明天试验一下。
(空) (
pcplayer
[883]
2008-06-12 15:57
)
FreeImage 也只对 DDB 有效。一旦设置为 pf24bit, pf8bit 等等,在线程中调用 bmp.SaveToStream 就可能出异常(大概几十次到几百次出一次)
(空) (
pcplayer
[461]
2008-06-13 06:55
)
你在弄什么?
(空) (
lukejee
[310]
2008-06-12 14:18
)
2个疑点:线程,pf24bit
(33字)
(
haitao
[364]
2008-06-12 14:25
)
BS 不认真看贴的。上面有试验结果报告。明天我准备拿到单核CPU的机器上跑跑看。
(空) (
pcplayer
[379]
2008-06-12 15:36
)
这个?没说主线程里执行是怎样,而且也一直没明确说释放。。。。。。
(370字)
(
haitao
[449]
2008-06-12 15:58
)
印象中Delphi的TBitmap会占用DeviceHandle,用完要释放,不然很久就OutOfResource了
(空) (
Miracle
[672]
2008-06-13 05:09
)
应该和 handle 释放什么的没关系。每次都重新创建 bitmap 对象,只要设置格式为 pf24bit 就可能在 SaveToStream 的时候出异常。
(104字)
(
pcplayer
[629]
2008-06-13 06:58
)
1. 代码在什么OS上执行? 2. Bitmap的Canvas,在*同一个线程中*锁定了没有
(110字)
(
Miracle
[410]
2008-06-13 07:19
)
XP, AMD 双核。
(空) (
pcplayer
[321]
2008-06-13 07:26
)
好,现在加上 canvas.lock 看看
(空) (
pcplayer
[449]
2008-06-13 07:28
)
加上 lock 跑了一会,现在还没出问题
(空) (
pcplayer
[327]
2008-06-13 07:30
)
跑了2万次了,还没出问题。估计就是 lock 的问题了。不过这个 bitmap 也就一个线程在用,不存在两个线程同时用到它而冲突的情况啊。
(空) (
pcplayer
[410]
2008-06-13 07:34
)
代码的实际执行,很多时候不像它写起来或者看起来那么单纯,呵呵
(82字)
(
Miracle
[392]
2008-06-13 07:39
)
我写的是测试代码,非常简单,只有一个独立的线程在操作一个 Bitmap,主线程没有去操作那个 Bitmap 。当然,可能 TBitmap 就是有什么BUG导致这个问题的。
(95字)
(
pcplayer
[459]
2008-06-13 07:42
)
delphi多线程里只要调用控件的话,就要调它自己的同步函数吧。
(22字)
(
Tomorrow
[988]
2008-06-13 07:39
)
非也,你说的那是影响到界面显示的控件。我用的是 TBitmap,和VCL主线程无关。而且我加上同步后,也一样出错。
(空) (
pcplayer
[382]
2008-06-13 07:44
)
记得曾经写过这样的程序,
(267字)
(
茶壶
[404]
2008-06-13 07:48
)
嗯,吸取教训,以后凡是要在线程里操作图像,都把 Canvas 加上 Lock。
(空) (
pcplayer
[437]
2008-06-13 07:55
)
Help: Do not call Lock unless there is a danger that another thread might interfere with d……
(空) (
pcplayer
[413]
2008-06-13 07:40
)
看里面这个
(55字)
(
Miracle
[417]
2008-06-13 07:47
)
看Graphics单元。
(72字)
(
茶壶
[401]
2008-06-13 07:40
)
经过5年,这个细节我已经完全不记得了,你不提我根本想不起来,还是你牛
(空) (
Miracle
[350]
2008-06-13 07:44
)
装,你就使劲地装。
(空) (
茶壶
[350]
2008-06-13 07:45
)
我测试的时候,因为那个 Bitmap 只有一个线程会去访问它,测试代码非常简单,所以没考虑到需要 Lock 的问题。而且帮助里也说:
(187字)
(
pcplayer
[447]
2008-06-13 07:47
)
开始跑题吧。。。。。。
(21字)
(
茶壶
[393]
2008-06-13 07:49
)
喝茶可也,喝酒免了。你是大牛+大米,俺是无米。
(空) (
pcplayer
[308]
2008-06-13 07:56
)
3. 线程定时反复执行?
(107字)
(
Miracle
[521]
2008-06-13 07:28
)
因该不是这个原因吧。是单独的一个线程,而非 VCL 的主线程,因此不涉及到消息处理的问题。
(空) (
pcplayer
[387]
2008-06-13 07:29
)
开发网难得一见的讨论Delphi技术的帖子,哈哈。一定要专门留个记号
(空) (
Miracle
[335]
2008-06-13 07:51
)
是处女开发网!这个贴也算是在老M同学的指导下有了个最终结论。
(空) (
pcplayer
[345]
2008-06-13 07:57
)
欢迎光临本社区,您还没有登录,不能发贴子。请在
这里登录