You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:33:41