回 帖 发 新 帖 刷新版面

主题:[讨论]关于Flock( )

[quote]Visual FoxPro 9.0 语言参考 
FLOCK( ) 函数 请参阅 示例  全部折叠 全部展开 尝试锁定当前表或指定表。
FLOCK([nWorkArea | cTableAlias])
参数 nWorkArea 
指定表所在的工作区,FLOCK( ) 函数对此表进行锁定。如果指定工作区没有打开的表,FLOCK( ) 函数的返回值为“假”(.F.)。 
cTableAlias 
指定待锁定表的别名。 注意: 
如果指定的表别名不存在,Visual FoxPro 将产生错误信息。 
返回值 逻辑型。如果成功锁定该表,FLOCK( ) 函数返回“真”(.T.);[color=ff00ff]而在下列条件下 FLOCK( ) 函数返回“假”(.F.):[/color]
表或表中的记录已经被其它用户锁定。
表没有在你指定的工作区中打开。
注意: 
如果 FLOCK( ) 函数锁定表的操作失败,返回“假”(.F.),[color=ff00ff]但并不产生错误信息。因此,FLOCK( ) 函数不触发 ON ERROR 例程。 [/color][/quote]
嗯,让我想不明白的是,在我的使用过程中,
这个函数在没有设置 SET REPROCESS TO 3 SECONDS 的时候死等其他用户解锁.
别人解锁后,自动往下运行,别人不解锁,就只好干等.
在设置 SET REPROCESS TO 3 SECONDS 后,锁定失败时没有返回函数值,而是出错,
于是我又设置了 On Error Return ,结果发现跟上面彩色语句不符,
是不是我在什么地方没弄明白?

回复列表 (共4个回复)

沙发

如果 FLOCK( ) 函数锁定表的操作失败,返回“假”(.F.),但并不产生错误信息。因此,FLOCK( ) 函数不触发 ON ERROR 例程。 

这句话是对的,没问题。

板凳

也许是我没说清楚.在我的使用过程中.
1.除非锁定成功返回.T.值,否则死等,不会返回.F.值
2.设置重试次数或时间后,锁定失败时,触发ON ERROR例程.

3 楼

2.设置重试次数或时间后,锁定失败时,触发ON ERROR例程

在ON ERROR例程中检查一下ERROR(),MESS()等,也许错误和FLOCK()无关,是别的错误触发ON ERROR例程。

简单打开2个vfp,一个先FLOCK(),另一个SET REPROCESS TO 3 SECONDS,?FLOCK(),过3秒就显示.F.,不会触发ON ERROR例程。

4 楼

谢谢指点,终于搞明白了出错的语句,原来是在FLOCK( )之前出错的.
那么简单的一两行的东西,为了防出错,变一大串出来了,唉.
[quote]_screen.Caption="操作提示:   删除:Ctrl+T     增加:Ctrl+Y  "
IF !USED("表")
  TRY 
   USE 表 IN 0 SHARED 
    IF FLOCK("表")
      SELECT 表
      BROWSE
      UNLOCK IN 表
    ELSE
      MESSAGEBOX("A.尝试锁定表时失败,有其他用户正在修改该表,请稍后再试.",0,"失败",30000)
    ENDIF 
  CATCH
    MESSAGEBOX("B.尝试打开表时失败,有其他用户正在修改该表,请稍后再试.",0,"失败",30000)
  ENDTRY 
ELSE 
  IF FLOCK("表")
     SELECT 表
     BROWSE
     UNLOCK IN 表
  ELSE
     MESSAGEBOX("C.尝试锁定表时失败,有其他用户正在修改该表,请稍后再试.",0,"失败",30000)
  ENDIF 
ENDIF 
_screen.Caption=" 应用程序  "[/quote]

我来回复

您尚未登录,请登录后再回复。点此登录或注册