现在的位置: 首页 > 综合 > 正文

信号灯

2012年02月03日 ⁄ 综合 ⁄ 共 1451字 ⁄ 字号 评论关闭
程序间行为,有互斥关系,这就需要有个“信号灯”标注之。
一但程序断线、正常或不正常退出,信号要及时取消。

意外情况下的信号取消,往往是难点, 利用SQL临时数据库中临时表的特性可达成。

信号灯相关功能 -> 设置、检查、去掉。

前提:(1)每个APP,登录后,迟续保持一个到SQL连接。
            (2)一些自定义函数,不言自明。

应用举例:(1)科目表、权限表等 树状结构的数据设置,不便做并发操作处理。简化逻辑为:先入者设
                               信号灯,可修改;后入者设信号不成功,则以只读方式进入表单;
                      (2)操作信登录后,其离线、在线状态,及相关的IM收发,需利用信号灯标识。
                      (3)不允许操作员重复登录的功能

Function glSignalSet
Lparameters tcSignal, tcExtraData
*- 设置信号灯.
*- 当重复设置(名相同)时, 若新旧信号是同一连接@@SPID, 允许重设. 不同连接,失败.
*-
*- 信号灯 将在 glSignalKill时 或 连接断开时 删除
Local cTmp,cSql,nArea,nSPid
nArea
=Select()
tcSignal 
= Chrtran(tcSignal,",' ",'') + '_'+ ;
    CHRTRAN(goapp._c系统名称,' '+Chr(39)+Chr(34),'') +'_' +;
    gcGetMacro(goApp._c数据连接串,'database',1,';;')

glSql(goApp._n连接句柄,
'sp_who @@SPID','_tmpcheckSPid')
nSPid=_tmpcheckSPid.spid

TEXT to cSql
    
Select top 1 * from ##<<tcSignal>>
ENDTEXT
If glSql(goApp._n连接句柄,cSql,'_SignalCreation',.F.,'') && exist old signal
    If nSpid != Val( gcGetMacro(ExTraData,'CnnHandle') ) &&不是本app设置的signal,不可重设.失败也罢
        Select (nArea)
        
Return .F.
    Endif
Endif
glSql(goApp._n连接句柄,Textmerge(
'DROP TABLE ##<<tcSignal>>'),'_SignalCreation',.F.,'')
*--

TEXT to cSql
    CREATE TABLE ##
<<tcSignal>> (ExtraData char(1000) )
    Insert into ##
<<tcSignal>> (ExtraData )    values ('{CnnHandle=<<nSpID>>} {ExtraData=<<Evl(tcExtraData,'')>>}')
ENDTEXT
If Not glSql(goApp._n连接句柄,cSql,'_SignalCreation',.F.,'')
    Return .F.
Endif

Return .T.
*************************************************

抱歉!评论已关闭.