在程序中建立一个新的线程,主程序根据使用者的要求向LISTBOX里添加数据。新的线程访问主线程的一个LISTBOX控件,读取控件中第一行的数据,然后删除第一行的数据。然后在新的线程中处理这个数据。
请问这样做需要处理线程的安全问题吗?
线程不安全会引起什么样的后果?

解决方案 »

  1.   

    >>新的线程访问主线程的一个LISTBOX控件
    我以前类似的项目中,我是在线程中 postMessage 一条消息给主窗口,让主窗口去更新自己的控件
      

  2.   

    肯定要处理,在Delphi内,对VCL进行处理的工作建议用Synchronize进行同步。
      

  3.   

    在delphi里处理vcl的都要线程安全。可用Synchronize简单解决。
      

  4.   

    >>请问这样做需要处理线程的安全问题吗?
    理论上要,实际上,可以不,你可以自己试验下
    >>线程不安全会引起什么样的后果?
    非法操作,程序自己退出
      

  5.   

    TO: 
    belllab(菜鸟) 
    qzxyd(只会种菜) 通过Synchronize,可以将子线程要执行代码通过消息传递给主线程,由主线程来执行,这样的话,这段代码就不是子线程代码,而是一般的主线程代码。我的系统就是因为一段打印的代码执行速度特别慢,所以建立子线程,使用了Synchronize,是不可以的。
      

  6.   

    TO: aiirii(ari-淘金坑)    同意你的看法。
    -----------------------------------------
    不包括主线程,如果两个或者更多个线程,我觉得在访问同一资源的时候Synchronize要用。
    否则可以不用。
      

  7.   

    为了避免与其他线程在访问一个全局对象货变量时发生冲突,需要在执行线程代码时锁定其他线程的执行,直至完成操作。VCL支持三种技术来达到这个目的: 
    (1) 锁定对象:有些对象自己有锁定的功能,如canvas 
    (2) 使用critical有提高内置的锁定功能,区 
    如果对象没需要使用critical区,Critical区在同一个时间只也许一个线程进入。为了使用Critical区,产生一个TCriticalSection全局的实例。TcriticalSection有两个方法,Acquire(阻止其他线程执行该区域)和Release(取消阻止)   每个Critical区是与你想要保护的全局内存相关联。每个访问全局内存的线程必须首先使用Acquire来保证没有其他线程使用它。完成以后,线程调用Release方法,让其他线程也可以通过调用Acquire来使用这块全局内存。   警告:Critical区只有在所有的线程都使用它来访问全局内存,如果有线程直接调用内存,而不通过Acquire,会造成同时访问的问题。例如:LockXY是一个全局的Critical区变量。任何一个访问全局X, Y的变量的线程,在访问前,都必须使用Acquire