我想连续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的使用,我正在利用Thread概念和我的代码看起来像这样:
//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;
}
}
答案 0 :(得分:0)
您发布的代码中缺少太多代码以告诉错误。
如果你无法修复它,只需使用按钮/ GUI /保持一个简单的循环,当时机成熟时,产生一个执行操作1),2)和3)的新进程,然后终止。如果您不需要花哨的GUI,您甚至可以编写一个等待键击的批处理文件,然后再生成该过程。
通过这种方式,操作系统将负责释放资源。
答案 1 :(得分:0)
所以你想连续24小时运行你的应用程序。你打算在此期间做任何事吗?如果你处于中间行动,你将如何优雅地退出?
假设您的应用并非毫无价值,并且您在24小时内确实有工作要做,那么您有很多选择:
CreateWaitableTimer
,另一个计时器,这次使用一个可等待的对象句柄来表示完成。如果您已经使用了可以使用的对象,那么这将直接进入您的设计。SetTimer
,它使用Windows消息执行相同的操作,但精度稍低。如果您使用Windows消息,这可能是一个不错的选择。timeSetEvent
会在经过一段时间后异步发出应用信号。您可以将其用作“退出时间”警报。使用此信息可以与主要工作人员完全分开发出信号。GetTickCount
或类似方法解决此问题,但很可能这不如其他选项。但它确实允许您即时调整逻辑(例如,if(x) { shorten the time we should run by 5 minutes }
。在这三种方法之间,您可以获得24小时后需要发出信号的所有信息。只要您的工作人员不这样做,这些方法都不会消耗CPU。它们都是操作系统发送的事件。
至于内存使用情况......你有一个简单的内存泄漏。以通常的方式修复它。弄清楚泄漏的位置并修补它。我不知道更多关于你的项目的信息。如果您在代码中的任何位置使用new
,请考虑切换到智能指针。