Z
bei mir tritt regelmäßig folgende Fehlermeldung auf: "nicht genügend Speicher vorhanden um Operation auszuführen".
Ich benutze ein ActiveX-Control ( http://www.signalrecovery.com/srinstcomms.htm ) um Daten von einem LockIn-Verstärker abzufragen.
Die obige Fehlermeldung tritt immer, wirklich immer auf, wenn ich genau 2 mal 297 Datensätze ( a 10 Daten) über das ActiveX-control abgefragt habe.
Kann es sein, dass das ActiveX-Control nur einen begrenzten Speicher hat und dieser dann voll ist? Wenn ja, wie kann ich diesen Speicher aus meiner Anwendung löschen?
hier mal mein code:
void CMessPrgDlg::LIMessen(CString LIKanal, CString LIDateiRoh, CString LIDatei)
{
COleSafeArray vResponseArray;
VARIANT vStatusByte;
VARIANT vResponse;
vResponseArray.vt=VT_VARIANT;
COleSafeArray vResponseArrayMag;
vResponseArrayMag.vt= VT_VARIANT;
COleVariant vResponseElementMag;
vResponseElementMag.vt = VT_BSTR;
//initialisiert die Variablen.. hoffe ich jedenfalls
VariantInit(&vStatusByte);
VariantInit(&vResponse);
VariantInit(&vResponseArray);
VariantInit(&vResponseArrayMag);
CString Magnitude="";
long n=0;
double SumMag=0;
double Mittelwert=0;
double SumVarianz=0, Varianz=0;
int pmt=0;
short a=0;
m_SRInstComms; //Variable des ActiveX-Controls
a=m_SRInstComms.WriteReadSRInstrument(0,LIKanal, &vResponse, vResponseArray, &vStatusByte);
// startet die Kurvenaufnahme
a=m_SRInstComms.WriteReadSRInstrument(0,"NC", &vResponse, vResponseArray, &vStatusByte); //erstmal Buffer löschen
a=m_SRInstComms.WriteReadSRInstrument(0,"CBD 20", &vResponse, vResponseArray, &vStatusByte); // CurveBuffer mit Magnitude
a=m_SRInstComms.WriteReadSRInstrument(0,"STR 10", &vResponse, vResponseArray, &vStatusByte);
a=m_SRInstComms.WriteReadSRInstrument(0,"LEN 10", &vResponse, vResponseArray, &vStatusByte);
Sleep(330); //nach dem Umschalten braucht LockIn einige Zeit bis stabil
a=m_SRInstComms.WriteReadSRInstrument(0,"TD", &vResponse, vResponseArray, &vStatusByte);
Sleep(110); // STR=10ms -> 100ms Timer zählt in schritten von 55ms
// Stand der Datenaufnahme Abfragen. wenn 3. ausgegebene Zahl >=16, aupfpassen! OVERLOAD!!!
a=m_SRInstComms.WriteReadSRInstrument(0,"M", &vResponse, vResponseArray, &vStatusByte);
a=m_SRInstComms.WriteReadSRInstrument(0,"DC. 2", &vResponse, vResponseArrayMag, &vStatusByte); // schreibt Mag in Array
long lResponseArrayElements = vResponseArrayMag.GetOneDimSize(); // fragt länge des Arrays ab
// frägt Verstärkungspannung der PMT's ab
if(LIKanal=="VMODE1") pmt=1;
if(LIKanal=="VMODE2") pmt=2;
m_fPMT585=float(MKAnalogRead(1,10));
m_fPMT680=float(MKAnalogRead(2,10));
//liest das übertragene Array aus
for(n=0; n<lResponseArrayElements; n++)
{
vResponseArrayMag.GetElement(&n,&vResponseElementMag);
Magnitude = vResponseElementMag.bstrVal;
SumMag=SumMag+atof(Magnitude); //berechnet den Mittelwert
ofstream OutFile(LIDateiRoh,ios::app);
if (!n)
{
switch(pmt)
{
case 1:
OutFile <<"Spannung PMT:"<<float(MKAnalogRead(1,10))<<endl<<"Nummer der Messung: "<<TimerCounter<<"\t"<<"Status der Datenaufnahme:"<<m_LIAnz<<"\t"<<"Anzahl der Elemente:"<<lResponseArrayElements<<"\n";
break;
case 2:
OutFile <<"Spannung PMT:"<<float(MKAnalogRead(2,10))<<endl<<"Nummer der Messung: "<<TimerCounter<<"\t"<<"Status der Datenaufnahme:"<<m_LIAnz<<"\t"<<"Anzahl der Elemente:"<<lResponseArrayElements<<"\n";
break;
}
}
OutFile <<n<<"\t"<<Magnitude<<"\t"<<endl;//Ausgabe in Datei
//OutFile <<n<<"\t"<<Magnitude<<"\t"<<Phase<<"\t"<<endl;//Ausgabe in Datei
//OutFile <<n<<"\t"<<XWert<<"\t"<<YWert<<"\t"<<Magnitude<<"\t"<<Phase<<"\t"<<endl;//Ausgabe in Datei
if(n==lResponseArrayElements-1) OutFile<<"End"<<endl;
}
Mittelwert=SumMag/lResponseArrayElements;
//berechnet die Standardabweichung
for(n=0; n<lResponseArrayElements; n++)
{
vResponseArrayMag.GetElement(&n,&vResponseElementMag);
Magnitude = vResponseElementMag.bstrVal;
SumVarianz=SumVarianz+(Mittelwert-atof(Magnitude))*(Mittelwert-atof(Magnitude));
}
Varianz=sqrt(SumVarianz/(lResponseArrayElements-1));
ofstream File(LIDatei,ios::app);
if(TimerCounter==1)
{
File<<"Spannung PMT:"<<"\t"<<"Zeit:"<<"\t"<<"MessZeit:"<<"\t"<<"Magnitude:"<<"\t"<<"Stabw:"<<endl;
}
//holt sich Systemzeit
CTime curTime = CTime::GetCurrentTime();
m_sTime.Format("%d:%d:%d", curTime.GetHour(), curTime.GetMinute(), curTime.GetSecond());
//schreibt die Mittelwerte in eine Datei
File<<float(MKAnalogRead(pmt,10))<<"\t"<<m_sTime<<"\t"<<float(Messzeit)/60000<<"\t"<<Mittelwert<<"\t"<<Varianz<<endl;
}