书上说,delphi的vcl对线程是不安全的,在下想问:是多个线程使用(还是同时?)同一个vcl组件对象不安全呢?还是多个线程只要使用vcl组件对象(不管是不是每个线程使用自己的组件对象)都会不安全?

解决方案 »

  1.   

    是指后者,即使你在每个线程只使用自己的vcl对象,但由于使用过程中涉及到内存的分配问题,而内存分配是在主线程处理的,而相关的变量并没有保护,所以大部分vcl组件都是非线程安全的
      

  2.   

    VCL不考虑多线程!...任何访问或修改应用程序界面的代码都应该在应用程序的主线程环境中执行。这种机制的缺陷是显然的,不过表面上看上去这种机制有一定的局限性,实际上还是有一点优势的。...
    首先,只允许一个线程访问用户界面,大大降低了应用程序的复杂性。...我们不必去注意那些潜在的同步问题...此外,由于VCL只能在一个时刻被一个线程访问,因此在VCL内部就可以不考虑多线程同步问题。这样的应用程序的结构更为简洁,从而有助于提高应用程序的整体效率。1. 只能在应用程序的主线程中访问VCL的属性和方法。
    2. TThread提供了名为Synchronize()的方法,该方法允许在应用程序的主线程内执行线程中的方法。该方法自动实现同步(内部实际上是串行执行)
    3. 另外一种技术可以作为 Synchronize() 的替代品,可以使用 SendMessage() 或 PostMessage() 来发送消息到另一个线程环境操纵的窗口。
      

  3.   

    忘了说:上述内容摘录自《Delphi6 开发人员指南》第五章多线程技术 5.2.4 和VCL同步
      

  4.   

    >>delphi的vcl对线程是不安全的,
    意思就是說, 如果你用多線程訪問同一個東西(vcl), 自己要做同步處理, delphi 沒幫你自動做
      

  5.   

    大家先看清楚题意吧!只有manfeng的话是对题的。注意,是“对题”,无关乎言论本身是否正确。本菜鸟也倾向(才疏学浅,无法肯定)于“多个线程只要使用vcl组件对象(不管是不是每个线程使用自己的组件对象)都可能会不安全”。(上面引用楼主的话中已经补充了“可能会”,避免引来ghyghost(爱国人士--海威思特) 之类“相对论”者。)
      

  6.   

    谢谢诸位,我想再举例细问一下,如果在两个子线程中都创建了一个ADO对象,不断同时的去访问同一个数据源,问这时程序会不会出现瘫痪的可能?
      

  7.   

    那要看你究竟用哪一个数据库驱动程序,如果用access就不是线程安全的,如果sql server就是线程安全的,当sql server驱动程序是线程安全不代表你这个程序就没问题,要保证整个系统都是安全的是十分困难的。