程序间行为,有互斥关系,这就需要有个“信号灯”标注之。
一但程序断线、正常或不正常退出,信号要及时取消。
一但程序断线、正常或不正常退出,信号要及时取消。
意外情况下的信号取消,往往是难点, 利用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
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.,'')
*--
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.
*************************************************
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 cSqlSelect 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 cSqlCREATE 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.
*************************************************