David: Just read the feature request thread for WebSockets and I'm pretty certain I voted for it (clicked 4 stars on the first message in the thread).
WebSocket fits well into the concepts of Call worker/form in that it's providing developers with more granular connections and, hence more granular control, over how data is requested and supplied. That would be a very welcome addition to the 4D toolset. -- Douglas von Roeder 949-336-2902 On Fri, Mar 17, 2017 at 3:02 PM, Douglas von Roeder <[email protected]> wrote: > David: > > I'll read up on the web sockets - when I first saw that I misread it for > "WebObjects". A cold chill ensued. > > C_Object is a great addition to the language. Agree that it doesn't do > everything that OT does but that why we have wrapper routines. I've > extended Cannon's OBJ_Module with OBJ_SetArray_Text/Long/Real and a few > other array commands and I can get a lot done with C_Object that I'm doing > in OT. The biggest benefits - scope/garbage collection and the content of a > C_Object is visible in the debugger. Those are "bloody mavhelous". > > "you're tossing blocks of code at the end of the thread of control over > there for one-off execution." > Excellent way to phrase it. And the emphasis is on "over there" because > the code executes in the context of the destination form. > > "execute in form" similar to "execute on client" > > "On Outside Call was always documented as being unreliable while CALL > FORM / CALL WORKER guarantee delivery." > OOC worked well form me, as far as I know (emphasis on the "AFAIK"). > I did have to tweak my original code to work in a Repeat loop, as you say, > Call form/Call worker will always get through so there's no need to jump > through hoops (loops) to make sure the message arrived. > > > "NTK's IPC channels easier" - agreed. I"m using an array-based derivative > of that approach (taken from ITK about 20 years ago) with a change in > 2000-01 and that's it. Highly reliable and zero maintenance but it doesn't > allow me to get to a specific form…which is what's needed to get at the * > dialog. Very nice to have multiple active windows in a process but > disappointing that I couldn't get to it with a message. > > > "You mention that you're doing message routine. This can be pretty darn > impossible to trace or debug if there's nothing in the message about the > path that it has followed." > I only had to chase messages "down a rabbit hole" a few times over the > years. Two ways of reducing the odds of that happening - one of the > properties of a message will allow the message and its metadata to be > displayed added to arrays displayed in a grid. I needed that to debug some > code that had become very involved and the end result is that it helped > force me to rethink my approach. > > The other technique that I've used it a bit dated now but was very helpful > before V11, back in the dark ages when "Find in design" was dreadfully > slow. That situation convinced me to use IP vars in the message. From > *MSGIP_Vars_Init*: > > C_TEXT(<>MSG_InsertCarriageReturn) > <>MSG_InsertCarriageReturn:="<>MSG_InsertCarriageReturn" > > C_TEXT(<>MSG_ProposalIsLocked) > <>MSG_ProposalIsLocked:="Proposals_is_Locked" > > C_TEXT(<>MSG_BringToFront) > <>MSG_BringToFront:="<>MSG_BringToFront" > > C_TEXT(<>MSG_Close) > <>MSG_Close:="<>MSG_Close" > > C_TEXT(<>PROC_Activated) > <>PROC_Activated:="<>PROC_Activated" > > > From On Outside call: > Repeat > > C_LONGINT($msgHandle_L) > $msgHandle_L:=MSGIP_Message_Get (Current process) > > C_TEXT($msg_T) > $msg_T:=MSGIP_TextMessage_Get ($msgHandle_L;False) > > Case of > : ($msg_T=<>MSG_BringToFront) > PROC_ResumeAndBringToFront (Current process) > > : ($msg_T=<>MSG_Close) > CANCEL > End case > > MSGIP_Message_Clear ($msgHandle_L) > > Until (MSGIP_MessageCount_Get (Current process)=0) > > > To your point about the provenance of the message, another significant > argument for an object without which it would be gruesome to try to add > that sort of data to…a BLOB?! No interest in the level of mental gymnastics… > > Time to have a looksee here - http://forums.4d.fr/Post/EN/ > 19129127/1/19129128 > > > -- > Douglas von Roeder > 949-336-2902 <(949)%20336-2902> > > On Fri, Mar 17, 2017 at 2:18 PM, David Adams via 4D_Tech < > [email protected]> wrote: > >> > Interesting approach - thank you for posting that. >> >> DvR: You, of all people, will *love* this approach. >> >> > Lacking "callers" and C_Object, I've been using On outside call + >> > ObjectTools + IP messaging based on the ITK message queuing system. >> >> Once you have access to V16, you may find: >> >> * You like C_OBJECT because it's very fast and native. But it won't do >> everything that ObjectTools does. >> >> * You may still want to use IPC channels from NTK. They're traditional >> messages, easily support a wider range of messaging patterns, and can be >> used to-from anywhere. >> >> * CALL FORM/CALL WORKER are great! You'll love them. On Outside Call was >> always documented as being unreliable while CALL FORM / CALL WORKER >> guarantee delivery. (Unless you kill a worker, kill a process, kill 4D, or >> crash. But, hey, that's pretty reasonable for a lot of situations.) >> >> > I'm not sure if this is germane to Call form/worker but I include a >> "reply to ID" >> > in the message that's sent. >> >> Yes, that can be entirely relevant. These 'calls' aren't a channel, you're >> tossing blocks of code at the end of the thread of control over there for >> one-off execution. There is no return message. You can send along callback >> details if, for example, you need a result. There are times when you'll >> find NTK's IPC channels easier. And, yes, message discipline is _super_ >> beneficial. You mention that you're doing message routine. This can be >> pretty darn impossible to trace or debug if there's nothing in the message >> about the path that it has followed. >> >> Tip: I've found it helpful to define a 'recipient' object as a specific >> type. This can be the recipient of a CALL FORM/CALL WORKER message or the >> callback details when you want a result, error, or confirmation message >> returned. By treating this as a custom data type, it's easy to have a >> single method for creating recipients and for validating them. >> "Validating" >> matters if you, for example, want to be sure that method names exist and >> that window refs are valid. >> >> > My projects are just moving to 15.x now so Call worker/call form are >> still >> > a bit out of reach for me but I'm glad to see that these have been added >> to >> > the language. They're a natural outgrowth of OOC, Call subform >> container, >> > etc., and we *finally* have a way to communicate with those windows >> opened >> > in the asterisk. >> >> Yeah, you'll love it. Given our existing framework, you'll feel like some >> things are missing - so keep NTK around. Also, vote for a native >> WebSockets >> implementation. This would be an *amazingly* great addition to 4D. You >> could have a persistent, bi-directional, point-to-point pipe between >> processes on one machine or different machines. Game changer. >> >> WebSocket protocol on 4D webserver >> http://forums.4d.fr/Post/EN/19129127/1/19129128 >> ********************************************************************** >> 4D Internet Users Group (4D iNUG) >> FAQ: http://lists.4d.com/faqnug.html >> Archive: http://lists.4d.com/archives.html >> Options: http://lists.4d.com/mailman/options/4d_tech >> Unsub: mailto:[email protected] >> ********************************************************************** >> > > ********************************************************************** 4D Internet Users Group (4D iNUG) FAQ: http://lists.4d.com/faqnug.html Archive: http://lists.4d.com/archives.html Options: http://lists.4d.com/mailman/options/4d_tech Unsub: mailto:[email protected] **********************************************************************

