Jump to content

drjdpowell

Members
  • Posts

    1,964
  • Joined

  • Last visited

  • Days Won

    171

Everything posted by drjdpowell

  1. Can you provide a hardware trigger at the high point of your pulse peak? Then you could trigger the DAQ read at the exact peak.
  2. I can do that. Wait, what?!? How can I have missed that little option for so long! Thanks. Can one set a while loop to index by default for new tunnels? As I understand it, vi.lib is now recommended for installed packages. I’m not a Quickdrop user so I don’t notice these things. It looks to me like Quickdrop uses the VI title rather than VI name, so I may be able to improve things without breaking backwards compatibility (make the title of Open.vi “SQLite Open” etc.). Hey now, "(,,,) FROM” comes up as the very first entry in my Quickdrop so why do you need to type it? Actually, I’ve considered removing those two SQL formatting utility VIs as I haven’t found the need to use them. Have you found them useful?
  3. Do you have a four-core machine? I ask because then four clones will initially be reserved of the various shared-clones at start, and then the fifth instance will require a new clone. In working with shared clone pools (through an 0x40 reference to "Open VI Ref”) I have sometimes noticed what seems to be a delay in getting that extra clone when it is asked for soon after the reference is opened. BUT, I have never seen this delay actually stop code from working.
  4. Are you overriding “Pre-launch Init.vi” such that it might produce an error (thus preventing the sending of the enqueuer back to the Launch VI)?
  5. You supply a reply address, and its optional. And the reply address does not have to be the sender’s; replies can be directed to any third party that the sender has the address of.
  6. Ah yes, each message contains a reply address of “Send” class. So messages depend on “Send”, but not (I think) on any of the child classes of “Send”.
  7. How would you do it? (Though you can explain what you mean be the Inverted dependency thing also.)
  8. Well, the methods that send messages meant for the “TCP Client Actor” are dynamic-dispatch overrides of “Create” and “Destroy”. The only extra API method that RemoteTCPMesenger adds to the standard Messenger API is “Remote Service”, which is called first to define the IP address and service name to connect to. But I’ve lost the chain of thought. Remember, I need RemoteTCPMessenger to work in an extensive body of code that works with the generic “Send” and “Messenger” classes, thus I need to have it work through a predefined simple API (Create, Send, etc.), not some new TCP-specific API. Large parts of the codebase must be blind to the fact that it is using TCP. If the internals of RemoteTCPMessenger need to be slightly unclear to achieve this, that is no big problem, as the user of the messaging package doesn’t need to know this internal detail. Could you expand further? I send messages to an address, after someone has created the address; which I think is the same as how Lapdog does it. Here, BTW, is an example I’m going to add to the next version: A TCP client that communicates by request-reply with a server, and receives the messages back (for demonstration) in three different ways (by queue, User Event, or Notifier). The only TCP-specific API method is the “Remote Service” VI called first.
  9. If I recall the quote right, it’s the singletons you think you made thread safe that particularly inspire God’s wrath. Presumably because you actually didn’t.
  10. Shaun, I think Daklu is referring to the need to register on your site in order to download the example. I just tried a test of attaching a VIPM package to this post and “This upload failed”, so perhaps the issue is with LAVA. BTW, here is the presentation slides Daklu is referring to (it’s on the CLA group at NI.com, but that group is restricted): CLA Summit 2013 Final.pptx In hindsight, I think it was too technical; I should have focused more on the “what” then the “how”.
  11. It would be Address.Send if I were doing it today. “Send” is anything to which I can send a message. It’s a bit confusing because it is more general than a communication method like a queue (such methods are under the subclass “Messenger”). No, I’m actually going for 100% transparent TCP communication. Having message-sending code by able to work with any transport method was the original motivation of my messaging system. Whether that is really achievable with the intricacies of TCP I’m not sure, as I have not had a TCP project to work on in years. But there is no “SendButDontForward” message. Well, part of my philosophy is to have simple subcomponents whose messaging interaction is configured by higher-level components. So the subcomponent still needs to be provided a simple “address” to “send” to, even if the higher-level component knows that “address” as a more complex object with extra methods. Edit: Forgot to add: RemoteTCPMessenger is intended to either BE a network proxy, or be the Messenger inside a network proxy.
  12. The technique of overriding a “Send” method can be used in multiple different ways. PrefixQueue might not be the most closely-related example. Well, as an example, here is the “Send” override method of my “RemoteTCPMessenger” class: As you can see, RemoteTCPMessenger wraps and sends messages to a TCP Client Actor. Other methods of RemoteTCPMessenger can send alternate messages to TCP Client to control it. Could I send the TCP messages directly and skip the actor? Well, in this case I have to route message replies and published event messages back through the TCP connection and thus need some process listening on that. Once I have to have the client actor anyway, it is cleaner and simpler to let it handle all aspects of the TCP connection. A TCP connection is too complex a thing to be left to a passive object.
  13. Opps. Sorry, I missed that. Not if you have a dynamic-dispatched “Send” method, in which case the wrapping of the original message in the SendViaTCP message can be inside the Send method. It’s the same technique you’re using in your LapDog PrefixQueue, where the sending process is unaware that the messages it is sending are having a prefix added. Similarly, a process doesn’t have to know it is sending messages via TCP. This isn’t really what I’m thinking of. “Outer Envelope” suggests a message holding another message. I don’t see why the inner message need be empty (an unfilled “inner envelope”). — James
  14. He’s actually using what I call “Outer Envelopes”. You didn’t like them when I suggested them before. In fact, I use a “Send Via TCP” outer envelope in my TCP message system.
  15. But would it not be easier to refactor in TCP communication if the extra added processes of TCP send/receive don’t have to be custom created to handle specific messages. And if my end processes are “X” and “UI for X”, how useful is it to have three intermediate message-handling stages? Surely at least one of that long message chain doesn’t need to know what an “Enable Motor” message means?
  16. How do you distinguish language from meta-language if both are text?
  17. If it’s in a standard LabVIEW install then you can use it. I used the QMH template, if I recall.
  18. JamesMc86 is suggesting the possibility of writing a by-val class and allowing the application level to decide on DVR use (or not). The other options are writing a class API that takes DVRs as you’re doing, or use DVRs internal to the class (as todd mentions). If one is doing a class API that takes DVRs, then I agree you probably want to restrict use of the IPE to within that API.
  19. Some random thoughts: 1) I tend not to have an actual “UI actor”; instead I have each actor have it’s own UI on its front panel, and have the main actor present the subactors in one or more subpanels (or just open their windows. This involves less messages to pass around. 2) One can also deal with needing lots of messages for lots of UI controls by treating the controls generically using techniques illustrated below. This is a “Control Server” example that I don’t think is in the version of “Messenging” in the code repository, but will be in the next version. Changing any control in Pane 2 of the “Control Client” sends a Variant Message that then fires a Value Change event in the Control Server. You can do the same thing with “Notify”, and you can also write generic code for setting cluster items using OpenG functions. Would this kind of stuff help reduce the programming burden? 3) The above technique in (2) is event driven (User pushes button —> sends message —> fires Value Changed event). In contrast, using a DVR requires the receiver to poll for changes to the UI settings it cares about. It also works remotely (the example above works over TCP), though that is often not needed.
  20. You mention “actors”, but one of the main points of the Actor Model is to use message passing instead of sharing by-reference data. So why not just send update messages when the User changes something?
  21. Unfortunately it’s on the restricted CLA group, but here is a very interesting presentation on XControls: Round Table Discussion - XControls
  22. It’s supposed to work with enums, and my test case seems to work. "Variant to JSON" delegates enums to OpenG’s “Scan from String” which calls OpenG “Set Enum String Value”, so it should work. What error did you get and what enum string did it have?
  23. Have you tried recreating the parent “Execute” message from scratch?
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.