如何连续运行C ++应用程序?

时间:2012-08-29 12:45:34

标签: c++ windows

我想连续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;
}
    }

2 个答案:

答案 0 :(得分:0)

您发布的代码中缺少太多代码以告诉错误。

如果你无法修复它,只需使用按钮/ GUI /保持一个简单的循环,当时机成熟时,产生一个执行操作1),2)和3)的新进程,然后终止。如果您不需要花哨的GUI,您甚至可以编写一个等待键击的批处理文件,然后再生成该过程。

通过这种方式,操作系统将负责释放资源。

答案 1 :(得分:0)

所以你想连续24小时运行你的应用程序。你打算在此期间做任何事吗?如果你处于中间行动,你将如何优雅地退出?

假设您的应用并非毫无价值,并且您在24小时内确实有工作要做,那么您有很多选择:

  1. CreateWaitableTimer,另一个计时器,这次使用一个可等待的对象句柄来表示完成。如果您已经使用了可以使用的对象,那么这将直接进入您的设计。
  2. 使用较轻的SetTimer,它使用Windows消息执行相同的操作,但精度稍低。如果您使用Windows消息,这可能是一个不错的选择。
  3. 使用timeSetEvent会在经过一段时间后异步发出应用信号。您可以将其用作“退出时间”警报。使用此信息可以与主要工作人员完全分开发出信号。
  4. 偶尔检查系统时间。由于系统时钟更改,夏令时,自动时间调整,我会推荐这个。您可以使用GetTickCount或类似方法解决此问题,但很可能这不如其他选项。但它确实允许您即时调整逻辑(例如,if(x) { shorten the time we should run by 5 minutes }
  5. 在这三种方法之间,您可以获得24小时后需要发出信号的所有信息。只要您的工作人员不这样做,这些方法都不会消耗CPU。它们都是操作系统发送的事件。

    至于内存使用情况......你有一个简单的内存泄漏。以通常的方式修复它。弄清楚泄漏的位置并修补它。我不知道更多关于你的项目的信息。如果您在代码中的任何位置使用new,请考虑切换到智能指针。