一但程序断线、正常或不正常退出,信号要及时取消。
意外情况下的信号取消,往往是难点, 利用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.
*************************************************
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.
*************************************************