exeを少なくとも24時間継続的に実行したい。このタスクを達成する方法、誰かがこれについて私を導くことができます..私のサンプルコードはこのようなものです..この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 のメモリ使用量を消費し、最終的にアプリケーションはスクリーンショットを撮りません。ここで、メモリリークが発生すると思いますので..
2 番目の試み: 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.
}
このコードは、メモリ使用量 1.5k で 7 ~ 8 時間連続して実行できます。8 時間後、コードは再びスクリーンショットを取得しません。ここでメモリ使用量は一定であり、なぜそれが機能していないのかわかりません..??
私の3回目の試み:
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.
}
}
これも 2 回目の試行と同じです。このコードは、1.5k のメモリ使用量で最大 6 ~ 8 時間実行できます。その後、スクリーンショットはありません。
しかし、私が知っていることの1つは、何年も継続的に実行できる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;
}
}