起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 187|回复: 2

【结贴】[急]两个事件的偶然冲突问题。

[复制链接]
发表于 2009-7-16 11:48:11 | 显示全部楼层 |阅读模式
我的代码中有两个事件,一个是时钟timer事件,如下:
procedure TMAINFORM.Timer1Timer(Sender: TObject);
begin
   FWdatasetBroker.DataSet.Refresh;
    Timer1.Interval:=1000*30;
   Timer1.Enabled:=true;
end;
该timer就是刷新数据集,
还有一个popupmenu,它有一个“处理”子menu,这个处理按钮的事件是:
procedure TMAINFORM.N1Click(Sender: TObject);
var

  lDataSet : TDataSet;
  lTaskParam: TLoadTaskParam;
  lFlowParam: TLoadFlowParam;
  lTasks: TTasks;

  lFunc: TFunc;
  lFlowControl: TFlowControl;
  lContext: TContext;

  lContextCurrent: TContextCurrent;
  lOrgUnit: TOrgUnit;
  APerson:String;

  ldept,lgw,lid:string;

begin
  ldept := getCurDeptID;
  lgw := getCurGW;
  lid := getCurID;
  CommonLib.TCommonLib.UserStartFlow(Context, 'Biz:\FWT\PROC\FWLC.PROC', 'FWQQ', FWDataSetBroker.DataSet.FieldByName('FWQQB_BH').Asstring,'', 'desc', ldept, lgw,  lid);
  lDataSet := FWDataSetBroker.DataSet;

  if not lDataSet.Active or lDataSet.Eof then
    Exit;

  lFlowParam := TLoadFlowParam.Create;
  lTaskParam := TLoadTaskParam.Create;
  lTasks := TTasks.Create;
  try
  //  dialogs.ShowMessage(lDataSet.FieldByName('FWQQB_BH').AsString);
    //根据ProductID,找到对应的流程Guid值
    DoGetFlowGUIDs(lDataSet.FieldByName('FWQQB_BH').AsString, lFlowParam.GUIDs);
    lTaskParam.States := [TTaskState.tsStarted, TTaskState.tsProcessing, TTaskState.tsWaiting];

    lFlowParam.ProcURLs.Add('Biz:\FWT\PROC\FWLC.PROC');
    //以给定的条件查询任务(这里给定的条件由lFlowParam给出,根据流程Guid值查询,lTaskParam条件是按照任务状态,只查询出需要处理的任务)
    Flow.FlowEngine.GetTasks(lFlowParam, lTaskParam, lTasks);

    lContextCurrent := TContextCurrent.Create(Context);
    lOrgUnit := lContextCurrent.PersonMember;
    APerson := lOrgUnit.ID;
    if APerson = lTasks[0].TaskMessages[0].ReceiverID then
    begin
       lContext := GetTaskContext(lTasks[0]);
       lFunc := SystemCore.TSystemCore.FuncManager.RunTask(lContext, lTasks[0]);
    end else
    Business.Forms.Dialogs.ShowMessage('该任务未交由您处理');
    //SystemCore.TSystemCore.FuncManager.RunTask(SystemCore.TSystemCore.Operator.Positions[0], lTasks[0]);
  //如果需要自动流转,则需要下面的代码vvvvvvvvvvvvvv
    //lFlowControl := lFunc.Context.GetParentContext(BizSys.IL_FLOW).Owner as TFlowControl;
    //lFlowControl.FlowOut(nil);
  //如果需要自动流转,则需要下面的代码^^^^^^^^^^^^^^
  finally
    lFlowParam.Free;
    lTaskParam.Free;
    lTasks.Free;
  end;
end;
发现在偶然的情况下,也就是timer事件执行时,刷新数据集时,如果正好这时按下了“处理”按钮,那么N1Click事件就被执行了两次。
不知道是为什么?
有没有什么办法避免呢?
比如:timer事件中限制,此时不接受N1click事件,或者其他别的方法?
回复

使用道具 举报

发表于 2009-7-16 13:35:40 | 显示全部楼层
加一个变量。菜单里面执行事件前后赋值他的状态。
timer里面去判断这个变量,如果是在菜单事件执行中,取消这次刷新,或者一直等待菜单执行完。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-31 09:18:07 | 显示全部楼层
这样可以解决,多谢,结贴!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-17 03:23 , Processed in 0.037305 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表