// need to be careful here as might get called at wrong point. May need to check with driver. void NetShrVarInterface::epicsExitFunc(void* arg) { // NetShrVarInterface* netvarint = static_cast<NetShrVarInterface*>(arg); // if (netvarint == NULL) // { // return; // } // if ( netvarint->checkOption(Something) ) // { // } CNVFinish(); }
int CVICALLBACK threadFunc (void *functionData) { char textline[1024]; volatile int stop = 0, loop = 0; double value = 0.0; CNVBufferedWriter bufferedWriter; CNVData data = 0; int error; char buffer[MAX_PATHNAME_LEN]; // wait for tread lock CmtGetLock (lock); // release the lock CmtReleaseLock (lock); status = 2; // run while loop SetCtrlVal (panelHandle, PANEL_STATUS, status); SetCtrlVal(panelHandle, PANEL_TEXTSTRING, "Nice! thread() has been started!"); Delay (1.0); error = NetworkVariablePopup (buffer); if (error < 0) { MessagePopup ("Error", GetGeneralErrorString(error)); return 0; } else if (error > 0) { SetCtrlVal (panelHandle, PANEL_NAME, buffer); SetWaitCursor (1); error = CNVCreateBufferedWriter (buffer, DataTransferredCallback, StatusCallback, 0, 10, 10000, 0, &bufferedWriter); SetWaitCursor (0); if (error < 0) { MessagePopup ("Error", CNVGetErrorDescription(error)); return 0; } else { SetCtrlVal (panelHandle, PANEL_CNVSTATUS, "Connected"); } } CNVCreateScalarDataValue (&data, CNVDouble, value); while (stop == 0) { SetCtrlVal (panelHandle, PANEL_LED, 0); GetCtrlVal (panelHandle, PANEL_STOPBUTTON, &stop); Delay (0.2); sprintf (textline, "%i, %i", loop++, stop); SetCtrlVal (panelHandle, PANEL_TEXTSTRING, textline); value = loop; CNVSetScalarDataValue (data, CNVDouble, value); CNVPutDataInBuffer (bufferedWriter, data, CNVDoNotWait); } SetCtrlVal(panelHandle, PANEL_TEXTSTRING, "Nice! thread() has been stopped!"); Delay (1.0); CNVDisposeData (data); CNVDispose (bufferedWriter); CNVFinish (); status = 3; // exit threadFunc() SetCtrlVal (panelHandle, PANEL_STATUS, status); return 0; }