ActiveX-nicht genügend Speicher vorhanden um Operation auszuführen
-
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; }