我想至少 24 小时连续运行我的 exe。如何完成这项任务,有人可以指导我。我的示例代码是这样的。这个 Run_Continously() 函数必须在循环中连续执行。
我之前的尝试是这样的: 第一次尝试:
int Cmfc2Dlg::Run_Continously()
{
//Task 1: code to Take ScreenShot(img.tiff format)
//Task 2: code to Read the image file using OCR
//Task 3: Based on data read from the image, other operations are there.
return 1;
}
void Cmfc2Dlg::OnBnClickedButtonOK()
{
while(Run_Continously());
}
这连续运行。但问题是CPU使用率。在某些小时后,例如:运行 2 小时后,应用程序消耗 250,453 内存使用量,最后应用程序不会截取任何屏幕截图。在这里我猜内存泄漏是这样发生的..
第二次尝试:为了减少 CPU 使用率,我正在使用线程概念,我的代码如下所示:
//Header.h
class Cmfc2Dlg
{
public:
static DWORD WINAPI Run_Continously(LPVOID lpParam);
};
//source.cpp
DWORD WINAPI Cmfc2Dlg::Run_Continously(LPVOID lpParam)
{
//Task 1: code to Take ScreenShot(img.tiff format)
//Task 2: code to Read the image file using OCR
//Task 3: Based on data read from the image, other operations are there.
return 0;
}
void Cmfc2Dlg::OnBnClickedButtonOK()
{
Handle_Of_Thread_1 = CreateThread( NULL, 0,Run_Continously, &Data_Of_Thread_1, 0, NULL);
if ( Handle_Of_Thread_1 == NULL)
ExitProcess(Data_Of_Thread_1);
WaitForSingleObject(Handle_Of_Thread_1,INFINITE);
CloseHandle(Handle_Of_Thread_1);
Sleep(1000); //This is mainly for so that CPU can can release some
threads & everytime CPU is not busy.
}
此代码可以连续运行 7 到 8 小时,内存使用量为 1.5k。8小时后,代码再次不会截图。这里的内存使用量是不变的,我不明白为什么它不工作..??
我的第三次尝试:
void Cmfc2Dlg::Run_Continously()
{
//Task 1: code to Take ScreenShot(img.tiff format)
//Task 2: code to Read the image file using OCR
//Task 3: Based on data read from the image, other operations are there.
}
void Cmfc2Dlg::OnBnClickedButtonOK()
{
while(1)
{
Run_Continously()
Sleep(1000); //This is mainly for so that CPU can can release some
threads & everytime CPU is not busy.
}
}
这也与第二次尝试相同。此代码最多可以运行 6 到 8 小时,内存使用量为 1.5k。之后就没有截图了。
但我知道的一件事是,有些 exe 可以连续运行多年。那为什么我不能那样做??
如果有人知道这一点..请建议我..任何帮助/指导都将被接受..谢谢。
我的屏幕截图代码如下所示:
DWORD WINAPI Cmfc2Dlg::ScreenShot()
{
CImage image;
CWnd * pWnd;
CRect rect;
BOOL bStat;
HDC ScreenDC = ::GetDC(NULL);
HDC hDC = CreateCompatibleDC(ScreenDC);
HBITMAP hBitmap = CreateCompatibleBitmap(ScreenDC, 100, 100);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDC, hBitmap);
//(H,W)500,500
//(x,y)78,242
bStat = image.Create(110, 64, 24);
ASSERT(bStat);
if ( ! bStat)
return FALSE;
CImageDC imageDC(image);
::BitBlt(imageDC, 0 , 0, 110, 64, ScreenDC, 25 , 208, SRCCOPY);
CString strFull = "E:\\Thread\\Test.tiff";
HRESULT hr = image.Save(strFull, ImageFormatTIFF);
SelectObject(hDC, hOldBitmap);
DeleteDC(hDC);
::ReleaseDC(NULL, ScreenDC);
if (FAILED(hr))
{
TRACE( " Couldn't Save File: %s, %x " , (LPCTSTR)strFull, hr);
return FALSE;
}
}