EWRECW ;E'WMS Wachten op antwoord van E'WMS [ 05/09/2003 4:18 PM ] ; DEFANTW(sWaitRef,CallBack) ; Opbouw van een WaitHandle ; Return : WaitHandle New WH,Kode,WHOld,Label,Found Lock +^EWREC("WH") Set WH=$G(^EWREC("WH"))+1 Set:WH>999999 WH=1 Set ^EWREC("WH")=WH Lock -^EWREC("WH") Kill ^EWREC("WH",WH) Kill ^EWREC("WHC",WH) ; Verwijderen van WaitHandles met dezelfde WaitSleutel Set WHOld="" For Set WHOld=$O(^EWREC("WHC",WHOld)) Quit:WHOld="" Do .If $P(^EWREC("WHC",WHOld),"`",2)+1<+$H Kill ^EWREC("WHC",WHOld) Quit ; Meer dan een dag oud .Set Label="" .Set Found=$P(^EWREC("WHC",WHOld),"`")=@sWaitRef .For Quit:'Found Set Label=$O(^EWREC("WHC",WHOld,Label)) Quit:Label="" Do ..Set Found=^EWREC("WHC",WHOld,Label)=$G(@sWaitRef@(Label)) .Kill:Found ^EWREC("WHC",WHOld) ; Dubbel dus verwijderen Merge ^EWREC("WHC",WH)=@sWaitRef Set $P(^EWREC("WHC",WH),"`",2)=$H Set:$L($G(CallBack)) $P(^EWREC("WHC",WH),"`",3,99)=CallBack Set:$System.Event.Defined("EWRECFAST") Ok=$System.Event.Signal("EWRECFAST") Quit WH ZENDANTW(sZendRef,sWaitRef,CallBack) ; Opbouw van een WaitHandle en daarna verzenden van het aanvraag record New WH Set WH=$$DEFANTW(sWaitRef,$G(CallBack)) Do ZEND^EWRECR(sZendRef) Quit WH ZENDWAIT(sZendRef,sWaitRef) New WH,X Set Ok=$System.Event.Create("EWREC"_$J) Set WH=$$DEFANTW(sWaitRef,$J) ; $J meegeven voor $System.Event.Signal Do ZEND^EWRECS(sZendRef) Set Ok=$System.Event.Wait("EWREC"_$J,^EWREC("P","WAITTIME")+2) ; Max. x sec. wachten daarna ERROR Set $P(^EWREC("WHC",WH),"`",3)="" ; Geen callback meer If Ok'=1 Do ERROR^EWLOG($T(NOWAIT)) For I=1:1:10 Quit:$D(^EWREC("WH",WH)) Hang 1 If '$D(^EWREC("WH",WH)) Do ERROR^EWLOG($T(NOHANDLE)) Set WH="" Set Ok=$System.Event.Delete("EWREC"_$J) Kill:$L(WH) ^EWREC("WHC",WH) ; Verwijder waitcache Quit WH GET(WH,sRef) Kill @sRef Quit:'WH Merge @sRef=^EWREC("WH",WH) Kill ^EWREC("WH",WH) Quit CLEAN(WH) ; Opkuizen van de recordstructuur Quit:'WH Kill ^EWREC("WH",WH) Quit LOCATE ; Opsporen van WAITHANDLE volgens de nieuw binnengekomen record Set WH="" For Set WH=$O(^EWREC("WHC",WH)) Quit:WH="" Do Quit:Found .Set Label="" .Set Found=$P(^EWREC("WHC",WH),"`")=C .For Quit:'Found Set Label=$O(^EWREC("WHC",WH,Label)) Quit:Label="" Do ..Set Found=^EWREC("WHC",WH,Label)=$G(C(Label)) Do:WH DEBUG^EWLOG($T(WHLOC)) Quit:'WH Merge ^EWREC("WH",WH)=C ; Opslag ontvangen record Kill C ; Noodzakelijk voor ^EWRECR Set CB=$P(^EWREC("WHC",WH),"`",3,99) Kill ^EWREC("WHC",WH) ; Verwijder waitcache If CB?1.N Do .Set Ok=$System.Event.Signal("EWREC"_CB) .If Ok'=1 Do ERROR^EWLOG($T(NOINCOM)) Else Do:CB["`" EXECS^vhRES(CB,"","") H 1 ; Tijdgeven aan het andere process Quit ; Errormeldingen NOQUEUE ;"Geen job queues beschikbaar" NOWAIT ;"Waittimeout verstreken "_(^EWREC("P","WAITTIME")+2) NOHANDLE ;"Waithandle is niet ingevuld "_WH WHLOC ;"WaitHandle gelocaliseerd "_WH NOINCOM ;"Kan intercomm.dev niet openen "_CB_";"_WH