有这样一个结构体
Tgrppic = record
    size: integer;
    data: array of byte;
end;var  grppic: array of Tgrppic;data储存的是一定格式的图片信息(RLE8格式),然后在新线程里面把数据按格式画到内存中一个Tbitmap上面,可是同一段代码多线程执行时会出错,而单线程则不会。想向各位高手大侠请教一下,关于delphi线程同步的问题。如何才能使读到的数据不错误???求解~~

解决方案 »

  1.   

    多线程在跨线程访问内存时是会报错的,可以使用filemapping创建内存映射文件来跨线程操作
    另外要保证每个线程使用该tbitmap的时候其它线程不会也在访问他,所以使用临界区即可,Lz可以参看百度万一的博客,里面有示例的
      

  2.   

    楼上的:第一句话误人lz: 可以参考《windows核心编程》网上有下载,第6,7,8,9章,特别是第9章。
      

  3.   

    LZ看看Delphi5开发人员指南关于多线程,记得是第十一章,前面几个例子是演示两个线程写数组的,分别演示了临界区、信号量、互斥等,你看完了,肯定就会豁然开朗。同步说白了还是一个锁的概念。
      

  4.   

    加信号量,或是临界区吧。
    可以参考
    http://www.cnblogs.com/del/category/174761.html
      

  5.   

    2L的说得对,汗,更正一下
    进程不能访问其他进程的内存,一个进程中所有线程共享资源,跨线程访问内存在C#里存在线程保机制时会报错
    因为最近在用C#搞混了,抱歉
      

  6.   

    给LZ几个例子
    临界区(其中包含了Synchronize)
    http://www.cnblogs.com/del/archive/2009/02/12/1389368.html
    互斥
    http://www.cnblogs.com/del/archive/2009/02/13/1390295.html
    信号量
    http://www.cnblogs.com/del/archive/2009/02/14/1390747.html
      

  7.   

    临界区
    声明:
    var CS: TRTLCriticalSection;   
    初始化,可在窗体Show时初始化
    InitializeCriticalSection(CS); {初始化}
    线程中
    EnterCriticalSection(CS); //进行临界区
    ...
    synchronize(过程);
    ...
    LeaveCriticalSection(CS); //离开临界区
      

  8.   

    LZ报错不要紧,只要不是那种运行一天半天才报错的情况,一般都好查的。可以通过写写Log,检测下内存泄露等方式查证问题。
      

  9.   

    Synchronize
    或者 TRTLCriticalSection
    应该可以实现