procedure TWorkThread.Execute;
begin   while not Terminated do
   begin
    try
    // if FEvent > 0 then
     EnterCriticalSection(FIsLock);
      FTaskWork(FADOQuery);
    finally
     LeaveCriticalSection(FIsLock);
    end;
   //Sleep(10);    WaitForSingleObject(FEvent, INFINITE);   end;end;请问大家  我可以把  EnterCriticalSection(FIsLock);
                 LeaveCriticalSection(FIsLock);放到  FTaskWork(FADOQuery); 这个函数里面吗? FTaskWork是一个对象的函数  并非线程里的函数 这样我在线程里去掉EnterCriticalSection(FIsLock);
                 LeaveCriticalSection(FIsLock);
放到对象的函数里面去是一样的效果吗?这样会引起对象访问冲突么?

解决方案 »

  1.   

    一般的控制粒度为对象,当然,实际上你要看你的具体情况
    例:
    procedure TWorkThread.Execute
    var
      ObjImport:TObjImport;
    begin
      try
        EnterCriticalSection(FIsLock); 
        objImport.Execute//另一对象的接口函数;
      finally
        LeaveCriticalSection(FIsLock); 
        objImport.free;
      end;
    end;
      

  2.   

    可以

        try
        // if FEvent > 0 then
        EnterCriticalSection(FIsLock);
          FTaskWork(FADOQuery);
        finally
        LeaveCriticalSection(FIsLock);    end;      FTaskWork(FADOQuery); 如果你这个处理比较费时间的话,其它线程会一直等下去。
         
      

  3.   

    另外 在XP有些版本下 用EnterCriticalSection(FIsLock);  竟然会出错,2003SERVER 没事。
      

  4.   

    CriticalSection只跟线程有关,跟哪个函数,哪个对象的方法没有关系。每个函数或方法都可以在任意线程里执行。LZ搞得一团乱麻。