但是我在多个线程的不同的函数里都有使用到m_List,而且是一直死循环来读取m_List的。
代码如下:
while not terminated do
begin
  for i:= 0 to m_List.Count-1 do
  begin
    取值TNodeData(m_List.Objects[i]).ID 用来做一些工作。
  end;
end;当其它线程还在循环调用m_List时,如果这时候m_List被在主界面操作删除了一个成员,那么上面的代码不就有可能出错了?
像这样的死循环,我又不能加 m_cs.Enter 和 m_cs.Leave 来保护,因为加了会使这个循环会一直占用m_List。

解决方案 »

  1.   

    在D2010的版本中,可以使用ThreadVar 来申明一个线程变量。或者使用互斥区来访问。
      

  2.   

    LZ应该再看看线程同步的相关原理
    如果不想看,如果你的线程中对那个变量只是读而不写,也可以不做同步,但有可能会影响到改变量的更新。另外to ls,threadvar至少在 d5开始就有了,不一定要d2010,D5之前没用过不知道。不过threadvar的作用跟LZ的需求没什么关系,threadvar声明的变量的作用是为不同的线程中存储不同的值。