定义了20个线程,线程作的事是:从一个函数里取出一个字符串,然后进行处理,
那个函数如下:每个
Function GetStr : String;
begin
  inc(index);  //Index 是局部变量定义在implementation之后的
  if index<StringList.count then
     Result := StringList.Strings[i];
end;
但是在使用过程中发现一个问题:
有可能当某个线程运行到Result := StringList.Strings[i];时,另一个线程已经进来,并且执行了inc(Index);这样就不能取到这个相应的值了。
请问该怎么让程序排队去取??

解决方案 »

  1.   

    定义一个全局的TCriticalSection变量进行锁定var Lock: TCriticalSection;Function GetStr : String;
    begin
      Lock.Acquire;
      try
        inc(index);  //Index 是局部变量定义在implementation之后的
        if index<StringList.count then
           Result := StringList.Strings[i];
      finally
        Lock.Release;
      end;
    end;
    initialization
      Lock := TCriticalSection.Create;finalization
      Lock.Free;
      

  2.   

    对了,使用TCriticalSection需要uses SyncObjs;
      

  3.   

    sysu(死树) :谢谢您,这是一种不错的思路。
    还有个小问题,也就是说,如果某一线程进去后(还没有退出之前)锁定了,其他线程这个时候进来就不能取到字符串了,请帮忙看看,再次谢谢您.
      

  4.   

    对TCriticalSection理解不够!!所以才说了上面的话,晕...
    是不是在执行Lock.Acquire;时,如果Lock已经锁定,就等待,直到解除锁定??
      

  5.   

    多谢 sysu(死树) ,偶像!!
    马上给分!!