Progress4GL如何实现用户登录后定时弹出提示消息
Progress4GL 登录会话定时警告实现方案
核心实现思路
基于Progress4GL原生的事件处理机制实现无阻塞计时,全程不干扰用户正常业务操作,核心逻辑分4步:
- 登录验证通过时记录会话起始时间,优先取服务端/数据库时间,避免客户端时间篡改
- 用固定间隔轮询+事件派发机制做计时,不阻塞UI响应
- 双阈值校验:登录满9分钟弹出超时警告,满10分钟触发强制登出
- 加警告弹窗状态标记,避免重复弹窗干扰操作
完整代码实现
1. 会话变量初始化(放在主程序/登录窗口的变量定义段)
/* 会话超时配置参数 */ DEFINE VARIABLE iMaxSessionMins AS INTEGER NO-UNDO INITIAL 10. /* 最长会话时长10分钟 */ DEFINE VARIABLE iWarnThresholdMins AS INTEGER NO-UNDO INITIAL 9. /* 警告触发阈值9分钟 */ DEFINE VARIABLE iPollIntervalMs AS INTEGER NO-UNDO INITIAL 10000. /* 计时轮询间隔10秒,可根据精度需求调整 */ /* 会话运行时变量 */ DEFINE VARIABLE dtSessionStart AS DATETIME NO-UNDO. DEFINE VARIABLE lWarnSent AS LOGICAL NO-UNDO INITIAL FALSE.
2. 登录成功后启动计时监听
/* 以下逻辑放在账号密码校验通过、主窗口加载完成后执行 */ dtSessionStart = NOW. /* 若为C/S架构建议替换为数据库时间: dtSessionStart = GET-DB-TIME(DBNAME) */ lWarnSent = FALSE. DO WHILE TRUE: /* 先派发处理用户操作事件,保证UI不卡顿 */ PROCESS EVENTS. /* 计算已登录时长(单位:分钟) */ DEFINE VARIABLE dElapsedMins AS DECIMAL NO-UNDO. dElapsedMins = (NOW - dtSessionStart) / 60. /* 触发9分钟警告 */ IF dElapsedMins >= iWarnThresholdMins AND lWarnSent = FALSE THEN DO: MESSAGE "登录会话即将超时" SKIP "系统允许的最长单会话时长为10分钟,您已登录9分钟" SKIP "请尽快保存未提交的操作内容,1分钟后系统将自动退出" VIEW-AS ALERT-BOX WARNING BUTTONS OK TITLE "超时提醒". lWarnSent = TRUE. END. /* 触发10分钟强制登出 */ IF dElapsedMins >= iMaxSessionMins THEN DO: MESSAGE "会话已达最长有效时长,即将退出系统" VIEW-AS ALERT-BOX INFORMATION BUTTONS OK TITLE "会话超时". /* 此处替换为你系统的实际登出逻辑:关闭业务窗口、回滚未提交事务、跳转登录页 */ RUN p_Logout.p. LEAVE. END. /* 等待指定间隔后进入下一轮校验,NO-WAIT参数保证不阻塞事件响应 */ WAIT-FOR iPollIntervalMs MILLISECONDS NO-WAIT. END.
开发注意事项
- 计时基准不要用客户端本地时间,C/S架构用
GET-DB-TIME()取数据库时间,多层架构取AppServer端时间,防止用户修改本地时钟绕过超时规则 - 轮询间隔不建议小于5秒,会占用额外CPU资源;也不建议大于30秒,会导致警告触发时间偏差过大
- 如果需要做会话续期功能(比如警告弹窗加"延长会话"按钮),用户点击续期后直接重置
dtSessionStart = NOW、lWarnSent = FALSE即可重新开始计时 - 如果是多窗口交互场景,要把计时逻辑放在主窗口的持久化进程里,不要绑定到子业务窗口,避免窗口关闭导致计时中断
内容的提问来源于stack exchange,提问作者Harsha N
相关产品推荐
相关产品推荐

