Communicating With Controls in Form From Another Thread
Louis S.
White Plains, NY

Aug 29, 2011
13 Posts

Communicating with controls in form from another thread

Is there a recommended way to update controls in the UI thread from another thread?

DrATEasy (Ron Y.)
Mission Viejo,

Aug 29, 2011
235 Posts

Re: Communicating with controls in form from another thread

ATEasy built-in controls are thread safe and can be called from any thread including the threads that did not create the form or control.

Calling a control method or property from another thread will be slower than calling it from the thread that the control was create with and will result in a thread switch.  

Louis S.
White Plains, NY

Aug 29, 2011
13 Posts

Re: Communicating with controls in form from another thread

Is it preferred to use a global value with a mutex or some form of signaling than?

What would be the syntax for addressing the control in a form from the process function?

Thanks,
Louis

DrATEasy (Ron Y.)
Mission Viejo,

Aug 29, 2011
235 Posts

Re: Communicating with controls in form from another thread

1. No. Since the call to another thread control is a blocking call (will not return until the method or property are done). If the UI thread is just used to display a form that the delay should very small. If the main thread is running a test program than you should consider moving the form to the worker thread or use another thread for the form. In any case, make sure the UI thread uses WaitForEvent to handle the form events and minimize CPU usage.

2. If you have a global variable m_frm A: FormA and a control chkB. you need to make sure that the control and the from are defined as public and than call it from anywhere using m_frmA.chkB.

Louis S.
White Plains, NY

Aug 29, 2011
13 Posts

Re: Communicating with controls in form from another thread

I had forgotten to check the public box, thanks!

It does seem to run significantly slower doing the cross thread updates (43 Hz vs 10KHz), so I'm going to leave them out for now.  It's a standard form so it should be spending it's time waiting for events already.  I don't get much benefit from being above 1 KHz anyway since I'm generating my test waveform using tick().

DrATEasy (Ron Y.)
Mission Viejo,

Aug 29, 2011
235 Posts

Re: Communicating with controls in form from another thread

You don't really need to update the control that much since you can't see it anyways. Did you try a timer control  (10 updates per second 100 msec or 5 every 200msec)?

Louis S.
White Plains, NY

Aug 30, 2011
13 Posts

Re: Communicating with controls in form from another thread

I think I may have misunderstood how to set this up.

I created a thread that writes to an I/O card as often as possible.  1 kHz would be the ideal rate since the function being generated is dependent on tick which updates every 1 msec.  By putting this code in a timing-critical thread, I can run the output update at approximately 10 kHz.

This output is also controlled by a manual slider control which is disabled during this automated output.  It would be nice for the disabled control to show what the current output is so the user has a better indication of what the automated output is doing.  This doesn't have to be anywhere near as often as the updates, but can't get in their way.  If I had a separate timer updating the slider control, wouldn't that have to temporarily stop the update thread while it is getting the current value (either by reading from the I/O card or by accessing a global variable)?

DrATEasy (Ron Y.)
Mission Viejo,

Aug 30, 2011
235 Posts

Re: Communicating with controls in form from another thread

If the shared data is a numeric value you can access at the same time from the timer and the thread, I don't think you will have a lot of misses since the integer is pretty atomic. You can use a ACriticalSection object to lock and protect the global value from being access at the same time but this will slow things  a bit. See example for how to use that in Language.prg example (Multithreading task).

Louis S.
White Plains, NY

Aug 30, 2011
13 Posts

Re: Communicating with controls in form from another thread

That worked.  It still can cause slowdowns if I move the form object around, but it seems impervious to other outside events.



Please Note
You need to have a M@GIC account to participate in the Forums.
Not yet registered on our website? Click here to register today!

All content, information and opinions presented on the Marvin Test Solutions User Forums are those of the authors of the posts and messages and not Marvin Test Solutions'. All attachments and files are downloaded at your own risk. [Read More]