1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 <2019> 2020 2021 2022 2023 2024 | Index | 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 <2019> 2020 2021 2022 2023 2024 |
<== Date ==> | <== Thread ==> |
---|
Subject: | Re: generalTime/epicsTimeGetCurrent and casr questions |
From: | Hugo Slepicka via Tech-talk <[email protected]> |
To: | Mark Rivers <[email protected]> |
Cc: | "[email protected]" <[email protected]>, "Brands Helge \(PSI\)" <[email protected]> |
Date: | Wed, 13 Mar 2019 08:23:19 -0700 |
Hi Helge,
Thanks for the reply. I am not sure why the task of buffering should be pushed to the user.
caQtDM is described as a replacement for medm. But when I look at the medm code it does not create a new CA connection every time a slider is moved.
This is the code when a slider is moved:
void valuatorValueChanged(Widget w, XtPointer clientData,
XtPointer callbackStruct)
{
...
if(pr->writeAccess) {
medmSendDouble(pv->record,value);
/* Move/redraw valuator & value, but force use of
user-selected value */
valuatorSetValue(pv,value,True);
So it calls medmSendDouble() for each slider move. This is the code for medmSendDouble()
void medmSendDouble(Record *pr, double data)
{
int status;
Channel *pCh = &((caTask.pages[pr->caId/CA_PAGE_SIZE])
[pr->caId % CA_PAGE_SIZE]);
status = ca_put(DBR_DOUBLE,pCh->chid,&data);
#if DEBUG_SLIDER
if(data > 150.0 || data < -150.0) {
print("medmSendDouble: %g\n",data);
}
#endif
if(status != ECA_NORMAL) {
medmPostMsg(1,"medmSendDouble: ca_put failed: %s\n",
ca_message(status));
}
ca_flush_io();
}
Note that medmSendDouble does not create a new channel each time it is called. It uses a chid that was previously created. It seems to me that this is the preferred design for GUI programs. caQtDM is doing the equivalent of the ca_put command line utility, creating and destroying a channel on each put operation, which is much less efficient.
Can anyone answer how edm, CSS, and PyDM handle this?
Mark
________________________________
From: Brands Helge (PSI) <[email protected]>
Sent: Wednesday, March 13, 2019 3:16 AM
To: Mark Rivers
Cc: '[email protected]'
Subject: AW: generalTime/epicsTimeGetCurrent and casr questions
Hi Mark,
yes, you are completely right! I can give you much more examples then a slider, where this is for a small IOC a nightmare.
But what should be the best case. For a Message-Button this is enough and for other widgets too. The Plugin is only a link between the EPICS library, that could buffer such connections. You as a designer of a panel can do the same job with some Softchannels!
caQtDM gives you only the possibility to do something, we are not responsible what users do.
The problem in this is the housekeeping of channels together with the optimization of monitoring with the visibility and multiple windows.
But even then the optimization will not help against of the huge amount of SETS of an EPICS channel during a movement of a slider!
Best regards
Helge