-2

我想至少 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;
}
    }
4

2 回答 2

0

因此,您希望 24 小时连续运行您的应用程序。你打算在此期间做点什么吗?如果您处于中间操作中,您将如何优雅地退出?

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

  1. CreateWaitableTimer,另一个计时器,这次它使用一个可等待的对象句柄来表示完成。如果您已经在使用可等待对象,这将直接进入您的设计。
  2. 使用 Windows 消息,使用更轻量级的功能SetTimer,但精度略低。如果您使用 Windows 消息,这可能是一个不错的选择。
  3. 使用timeSetEventwhich 将在特定时间过去后异步向您的应用程序发出信号。您可以将此用作“是时候退出”警报了。使用它与您的主要工作人员完全分开发出信号。
  4. 只是偶尔检查一下系统时间。我推荐这样做,因为系统时钟更改、夏令时、自动时间调整。您可以使用GetTickCount或类似方法解决此问题,但很可能这不如其他选项。但是,它确实可以让您即时调整逻辑(例如,if(x) { shorten the time we should run by 5 minutes }.

在这三种方法之间,您拥有需要在 24 小时结束时收到信号的一切。只要您的工作人员不这样做,这些方法都不会消耗 CPU。它们都是操作系统发送的事件。

至于内存使用......你有一个简单的内存泄漏。以通常的方式修复它。找出泄漏的位置并修补它。在不了解您的项目的情况下,我只能这么说。如果您new在代码中的任何位置使用,请考虑切换到智能指针。

于 2012-08-29T13:08:54.653 回答
0

您发布的代码中缺少太多代码来说明问题所在。

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

这样,操作系统将代替您处理释放资源。

于 2012-08-29T12:51:39.553 回答