Could not lock target memory
Hi,
This is my first post on this discussion group. I am writing a code to collect data from a Camera using a Frame Grabber Board.
After the camera has been initialized and when I click on grab icon of my GUI with the code
Code:
UINT CDAQControl::DAQContThreadProc(LPVOID param)
{
CDAQControl* daq = (CDAQControl*)param;
DWORD object;
BOOL bResult;
for(;;)
{
if(!daq->m_PA->DAQScan(1))
{
// daq->_lock.Unlock();
CError::PrintErrMsg(ERR_SCAN);
break;
}//end if
bResult = daq->m_PA->ScanDone();
object = ::WaitForSingleObject(daq->_hStop,0);
if(object != WAIT_OBJECT_0 && bResult)
{
daq->m_PA->PostProcessing(1);
//add file processing code
daq->Notify(CONTMODE);
}
else
break;
}
daq->_lock.Unlock();
::PostMessage(ThisApp->m_pMainWnd->GetSafeHwnd(),USER_UPDATE_TOOLBAR,0,0);
return 0;
}//end daqcontthreadproc
Code:
int C975010TC::DAQScan(int num)
{
if(m_nSamples != num)
{
m_pixarrbuf->AllocateBuffer(num*m_nAnalogChannel);
m_nSamples = num;
}
m_GrabID = m_pCamera->Grab(0,m_pixarrbuf->GetBuffer(), FRAMES_IN_HOSTBUFF);
return true;
}
Code:
BOOL C975010TC::ScanDone()
{
DWORD AcquiredDy;
DWORD last_time,old_time;
DWORD deltaTime;
DWORD totalTime;
GRAB_EXT_ATTR ExtendedAttr;
CAM_ATTR attr;
totalTime = 0;
m_maxTime = 0;
m_minTime = 1000;
m_avgTime = 0;
last_time = 0;
m_pCamera->GetAttr(&attr);
BYTE *pHostBuffFrame;
int iSeqNum,iCount;
for (iCount=0;iCount<attr.dwHeight;iCount++) //Height=64,Width=1280
{
// Wait for a new frame to become available, and lock it
// so it can't be overwritten while we are processing and then displaying it
if (((iSeqNum=m_pCamera->GrabWaitFrameEx(m_GrabID,&pHostBuffFrame,IFC_WAIT_NEWER_FRAME,500,TRUE,&AcquiredDy,NULL,&ExtendedAttr)) >= 0))
{
old_time = last_time;
m_pCap->m_os->GetSystimeMillisecs();
if (iCount > 0)
{
deltaTime = last_time-old_time;
totalTime += deltaTime;
if (deltaTime > m_maxTime)
m_maxTime = deltaTime;
if (deltaTime < m_minTime)
m_minTime = deltaTime;
}
if (AcquiredDy < attr.dwHeight)
{
memset(pHostBuffFrame + attr.dwWidth * attr.dwHeight * attr.dwBytesPerPixel,0,
attr.dwWidth * (attr.dwHeight-AcquiredDy) * attr.dwBytesPerPixel);
}
// Release the frame back into the active circular acquistion buffer
m_pCamera->GrabRelease(m_GrabID,iSeqNum);
if (AcquiredDy < attr.dwHeight)
{
CError::PrintErrMsg(IDS_ERR_IMAGE_ACQUIRED);
return false;
}
}
Sleep(1);
}
if (iCount > 1)
m_avgTime = totalTime / (iCount-1);
return true;
}
Code:
int C975010TC::GetScanData(short *pixarr)
{
if(!pixarr || !m_pixarrbuf)
return false;
ReorderingBuf(pixarr, (short *)m_pixarrbuf->GetBuffer());
return true;
}
Code:
void C975010TC::ReorderingBuf(short* dest, short *src)
{
int i,j,m,joffset, koffset, moffset, noffset, frames;
frames = m_nSamples/m_nPixels;
joffset = 0;
koffset = 0;
for(i=0; i<frames; i++) // loop through number of requested scans
{
moffset = 0;
for(m=0;m<m_nAnalogChannel;m++)
{
noffset = joffset;
for(j=0;j<m_nPixels;j++)
{
dest[m_pixelmap[j]+koffset] = src[noffset+moffset];
noffset += m_nAnalogChannel;
}
moffset++;
koffset += m_nPixels;
}
joffset += m_nPixels*m_nAnalogChannel;
}
}
When I run this code I am getting a message on DOS screen repeatedly
ReadArea:Could not lock target memory.
Can someone please help me in solving this problem.
Thank You