Jump to content

hooovahh

Moderators
  • Posts

    3,433
  • Joined

  • Last visited

  • Days Won

    289

Posts posted by hooovahh

  1. I know it's hasn't even been a week since NI Week ended but does anyone know about the availability of presented slide material?  Throughout the conference I would hear presenters say something like "All this material will be available online".  So my question is will there be an aggregate place similar to this one for presentation material?  And if so when can we expect to see it?

  2. I've never heard of ALOHA but might check it out.  If it is an unbounded number of panels I assume they are doing similar techniques with Parent Child relationships.  Using subpanels alone does work but you have a limited number because you cannot add a subpanels (or any other control) at runtime.

  3. I dunno what they would say (ask 10 people and you'll get 20 different answers), but outside of the JKI-SM I never see a QMH implemented using an array of strings, as shown in the 2012 QMH vi template.  Interestingly, the implementation in the 2012 QMH project template is completely different.  In your opinion, which implementation correctly defines what a QMH is and how do you justify the claim?

    I didn't realize there was a new QMH in 2012.  You can still find the old (which is the one I was referring to) under File >> New... Templates.  The Project template for a QMH in 2012 is quite different and I have a whole new set of feelings towards.  Before 2012 I didn't think there would be a question on what is a QMH because NI had a template on it, and JKI had a template on it that both used an array of string.  So having these two be the only two examples I've seen I assumed that's what made it a QMH.  An array of states (in this case string) to be processed one at a time by going to the respective state.  Adding user events, and shift register data still kept it a QMH in my mind so all discussions of QMH I've had were with this very open state machine like pattern.

     

    You mentioned adding a "" case with an event structure inside it to process user inputs.  I presume you also have a constant wired to the dequeue timeout.  

    You would be wrong.  Generally I have a -1 timeout.  I use User Events as my messaging structure and I don't have timeouts unless I see a need for them to actually poll something periodically.  But even that can be handled by sending a message periodically instead.

  4. Part of what makes the QMH so controversial is it has never been well-defined and means something different to everyone.  When you say "QMH," what exactly do you mean?  The template?  The implementation pattern of a dequeue prim and case structure inside a while loop?  My argument is using QMH to refer to the implementation pattern isn't useful.  Describing a component's private implementation as a QMH tells me nothing of value.  Describing a component's public behavior as like a QMH tells me everything I need to know.  (Namely to not use it. ;) )

    Again maybe my misunderstanding but I thought it was well defined.  If I ask NI what is a QMH won't they open the template that comes with LabVIEW?  Now I never use that template as it is, I think I always add an event structure in the "" case, add a Default case to handle typo issues, and add a BFC (Big F***ing Cluster) on a shift register.  Is this now no longer called a QMH?  It feels like it is a QMH but it also feels like it is something more specific but it is still a QMH is it not?  

  5. Once you create a public interface for the AE using wrapper VIs, the fact it is implemented with an AE is irrelevant.  You don't care (or shouldn't care) that the wrappers use a non-reentrant VI internally or that the data is stored on an uninitialized shift register.  You only care that all the public interface VIs refer to the same data and access during read-modify-write operations is controlled correctly.

    I wasn't talking about terminology to public methods VIs, I was trying to say that when in a public forum and discussing FGV vs AE all that matters is that the audience understand what we are talking about.  And by that I mean a uninitialized shift register.

  6. Most of what I changed for listboxes in 2013 was related to calculating cell boundaries. From profiling the code, I discovered that a) when all rows were the same height, the algorithm for calculating a cell's bounds was slower than it needed to be and b) we were calculating cell bounds more often than we needed to. Since it's fairly common for all rows to be the same height, it was worth putting in an optimization for that case.

    That's very interesting.  So I would guess (haven't tested yet) that any coding around we have done in past applications to improve performance, will continue to improve performance in 2013, but we may find that these improvements are no longer needed.  Thanks.

  7. The con pane puts a practical limit on the number of methods an AE can support.  In theory you can jam every possible input and output into clusters and have an infinite number of methods; in practice it makes the AE much harder to use than other implementations.  Restricting the methods to get/set keeps it simple.

    So I'm sure others have done this too, but when I get this type of AE I will usually wrap the functions into SubVIs so only the important terminals are being shown for that function and then inline the VI.  So maybe Init will call the AE 3 times with different methods and using some but not likely all of the connector pane inputs.  I'm pretty sure I saw this technique on JKI's blog at one point.

     

    I agree with your definitions, but I also agree with Shaun that the need for these different terms might not be necessary.  I guess it should be directed to the audience you have.  Some may know what a Functional Global is, and no clue what an AE is (Action Engine for those who don't).  The different terms don't bother me too much because when talking to others about it, it rarely matters what kind of global is being used (as long as it isn't the native one), it just matters that we understand a non-re-entrant VI with uninitialized shift registers is keeping track of some data between calls.

     

    Also I'm curious, has anyone developed a tool to perform a search, for a specific VI, where it has an enum constant wired to a terminal, with a specific value wired to it?  I don't think it would be too hard but if I want to find all the places this particular VI has had the "Write Data" method used I either have to find all calls to that VI and look for the constant, or find all places that "Write Data" appears in my code with a string search.

  8. To summarize, here is what was changed, added:

    • New - Event Inspector Window (you're gonna love this!)

    This is great, but I have a home grown one that works with user events, and it works at run time as well.  So I have one window that will show me the last N number of user events generated between my Actors, and can then display the data (using the Variant Probe).  So if something goes wrong in the application I can see the chain of events that caused it.

     

    • New - High Priority events

    Neat but I think I will only use this on shutdown.  It isn't very often that I find a queue of events pilling up that I would need this but it's nice to have.

     

    • New - Flush Event Queue Function

    Neat again, but I don't think I'll need it.  Possibly to flush away extra window resize events, as already mentioned but I doubt I'll need it.

     

    • New - VI Scripting methods and properties for events

    Finally.  I posted on Lava a while ago when I found this "was not implemented".

     

    • New - Mouse Scroll Wheel Event

    Finally.  The ability to zoom a graph with the scroll wheel sounds like a feature that all graphs should have.  Also when doing things like having a scrollbar not attached to a control you can now have more flexibility on what happens when a user scrolls on top of a cluster (it can then change the scrollbar value)

    • Improvements to the Edit Events Dialog:
      • It's now resizable (Finally)
      • You can filter search the list of event sources and events. For easy navigation.
      • You can limit instances of the event in the static queue (Similar to Flush Queue function)

    All neat and I'm sure will help develop code faster.

    • Finally, there was a behaviour change: Non-handled, dynamically registered events do not reset the Event structure timeout terminal. In LabVIEW 2012 and older: Non-handled, dynamically registered events reset the Event structure timeout terminal.

    I never ran into this issue.

  9. I wouldn't call "the semantics between an Actor and QMH" a heated topic.  I can get... energetic... when I'm trying to explain the difference to people, but I don't get angry about it.

     

    The reason I talk about the differences between a QMH and an Actor is to try and show it's not just semantics--there are huge differences in how external entities interact with a QMH compared to how they interact with an Actor.  Your comment indicates I didn't do a good enough job communicating that message.  Either I didn't explain it well enough or you have a different idea about what a QMH *is* than I do.

    This is very well possible (that I don't fully understand).  If what you are saying is true then maybe the real reason I have a difficulty knowing the difference is I've never used a QMH the way you describe.  Sometimes I start with a QMH template, but by the end I have what you described as an Actor.  So I guess what I'm saying is I'm not sure I've ever used a QMH in an application, only an Actor.

  10. Semantics aside a FGV can have race conditions, just like a normal global.  But a FGV gives me the ability to perform other functions, other then just read and write.  Because I don't know how my applications needs will change in the future I never use native globals, and only FGV.  Lets say I'm storing an array of values, well I can have my method on the FGV "Read" "Write" and "Average" a native global can't do this without extra code which isn't that big of a deal but I prefer this method.

     

    Other functionality that can be done is stuff like WORM.  Where a global can only be written to once then it will generate an error if it is written to again.  Many of the pitfalls of a native global exist in these other VIs, but allowing added functionality, and also adding other debugging tools helps to make sure you don't shoot your self in the foot.  But it can still happen.

    • Like 2
  11. Point of clarification: an event that is registered with an ES that DOES NOT have a case in the ES (unhandled), will not reset the timeout. In 2012, events that were registered but unhandled would reset the timeout.

    Thank you for the clarification I knew there was some bug fix regarding how this was handled but I wasn't sure the specifics because I personally have that issue.

  12. The new Events features is my favorite. I did a presentation on this topic at NIWeek. I started a new thread to spur discussion (i don't want to derail the current thread). I'd like to get the community's input on the new event features. New Events Features in LabVIEW 2013
    This is by far my favorite too. I missed your presentation because it was the same time as another and a tough decision was made. While web services are slick but I don't know if I will use them any time soon. And what about MyRIO? I know this is a new features of LabVIEW thread but why is a FPGA and dual core arm running linux real-time, with built in WiFi, and USB host for $500 not getting lots of attention (price was mentioned by NI but not confirmed yet)
  13. What if you want to reset the graph when the user resizes the window? Or right clicks on a control? Or. Double presses the escape key? How would you handle this without the event structure? The code you described is very common using the timeout case. The only thing I would do different (but isn't needed) is to set the timeout to 1ms, then use elapsed time to only update every 100ms. Any event generated will reset that timer so if a user spams the keyboard where the event structure handles key down, the timeout may never happen. This functionality slightly changed in 2013. I haven't tried it but I heard the timeout isn't reset with dynamic events anymore.

    • Like 1
  14. You're welcome. :cool:

     

    (And sorry it took so long for us to find a way to address this).

     

    The changes that improved this performance were specific to the listbox, multicolumn listbox, table and tree controls. I don't expect that they will conflict with any "programming around the problem" tricks that you've used in the past.

    Thank you so very much.  Would you mind going into detail a little about what is done for the improvement?  Mostly just curious and if your answer is "It's complicated" then that's fine with me.  

     

    We were just guessing at the Lava BBQ and we assumed that it was doing behind the scenes, what we were doing as work arounds.  Things like only updating cells you can see in the control, and only loading data for the cells you can see (so a table only has 10 rows show so it loads those 10 rows at a time with a fake scrollbar)

  15. I'd be glad to give detailed feedback. But I will hold off a detailed response until after I see slides or the video. I can't remember all the things said but one of those things will help jog my memory.But know I left that session convinced I won't use the Actor Framework. Again I can give details later but I kept having this feeling that NI's AF had many restrictions, steep learning curve, restricted debugging, and didn't add much over other Actor/Asynchronous Engine designs.Another big turn off was the semantics between an Actor and QMH. I realize it is a heated topic, but I don't see the big deal and to be honest this could be my own opinion because I haven't had 1-on-1 discussions to hash out the and understand the topic fully.Ok one more thing. Other diagrams would help but I don't remember having a problem with what you had.

  16. Don't get me wrong I think a discussion about alternatives other then NI solutions is great.  But I have seen too many recent threads (mostly on the NI forums) where someone will post a question with their first post for a very specific thing.  Then a new member makes their first post promoting some other (usually software) solution which is shareware.  If this is not the case I apologize for jumping to conclusions.

  17. If I was a betting man I would say this os spam. A user with one post, then another user answers it who also has one post promotting another company.That being said I don't know if MyDAQ is a good solution if you need it to be rugged. But any DAQmx hardware is extremely easy to use. Start MAX and start using the hardware in seconds. Then open LabVIEW and an example or express vi to use the hardware. It can't be more simple.

  18. As I worked on this, I feel obliged to chime in :-) There are definitely other ways to do the same thing, and they're pretty much all easier than using Set/Get Control Value by Index.  The reason you would want to use Set/Get Control Value by Index is that it's very fast - just barely slower than wiring directly to an indicator.  So it's useful if updating control/indicator values is something you're doing many times a second - otherwise there's no reason to switch to it.
    That is really neat and I will want to do some tests to compare results with OpenG, and MGI options too. My original thout was replacing the save to panel and load but that will happen seldomly and a better use case is as you said, constantly updating a UI.
  19. I have been immortalized in the LV2013 release notes!   :P

     

    I am so glad they added this.  Although I think it is more because I kept calling support and asking them what each installer did what and when it was needed.  I was amazed that the top-tier test support guys didn't have any more clue than I did.  I'm betting this feature alone reduces the number of calls they get in the future.

    I had this issue just yesterday.  I built an EXE and and installer and put it on a new PC which complained about missing a DLL.  Lots of searching later I found it was an XNet DLL, so I searched for all XNet functions until I found one place where it was never being called.  I have yet to call support for this issue but I have spent alot of my own time trying to figure it out.

     

    EDIT: A few that caught my eye.

     

    Scripting the event structure.

    More control over events like queues (flush priority and size)

    Email with security

    Tasks/Todo lists built in (I was just about to make a tool for that)

    Better build errors (hopefully we won't see a blank details again)

    Control value by index seems neat but I think there are other ways to do the same thing

  20. Don't get me wrong, I can't wait to try it out and see what other features 2013 is going to have.

     

    So generally LabVIEW releases are hit and miss.  They will have a stability build, then a feature build, where the feature build will be great but usually rough around the edges.  Since having a service pack mid-way through the year this seems to make sure all released versions are solid.  For this reason I have no fear about using a SP1 version of LabVIEW.  But I am still apprehensive about switching to a new version before this SP1.  

     

    This could probably be made into a new topic, but do you believe you will switch to 2013 as soon as possible?  Or are you going to wait a bit and test the waters before diving in?  The idea of using new awesome stuff both frightens and excites me.  My colleges usually wait until SP1 because it lines up with the Veristand release so if I did go 2013 I would be the one finding all the issues first.

  21. WOO HOO!!! (sorry for the caps)

     

    It looks like (pending any major issues) that I will be going to NI Week for the first time.  Not fully sure what to expect but I'm excited and can't wait to meet more LabVIEW nerds, and see what NI has to offer.  

     

    I know there are a few here that owe me a beer, and a few that I owe to, so I hope we can square away some of that debt.

×
×
  • Create New...

Important Information

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