-2

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;
}
    }
4

2 に答える 2

0

したがって、アプリを 24 時間連続して実行する必要があります。その間に何かする予定はありますか?操作の途中である場合、どのようにすれば優雅に終了できますか?

アプリに価値がなく、その 24 時間に実際にやるべきことがあると仮定すると、多くの選択肢があります。

  1. CreateWaitableTimer、今度は待機可能なオブジェクトハンドルを使用して完了を通知する別のタイマー。すでに待機可能なオブジェクトを使用している場合、これは設計に組み込まれます。
  2. SetTimerWindows メッセージを使用して、精度がわずかに低下しますが、同じことを行う軽量化を使用します。Windows メッセージを使用する場合、これはおそらく良い選択です。
  3. which を使用timeSetEventすると、一定の時間が経過した後にアプリに非同期的に通知されます。これは、「終了する時間です」というアラームとして使用できます。これを使用して、メイン ワーカーとは完全に別個に通知します。
  4. ときどきシステム時刻を確認してください。システムクロックの変更、夏時間、自動時間調整のため、これはお勧めしません。または同様のものを使用してこれを回避できますがGetTickCount、ほとんどの場合、これは他のオプションよりも劣っています。ただし、オンザフライでロジックを調整できます (たとえば、if(x) { shorten the time we should run by 5 minutes }.

これら 3 つの方法の間には、24 時間が経過したときに通知を受けるために必要なものがすべて揃っています。ワーカーが CPU を消費しない限り、これらのメソッドはいずれも CPU を消費しません。これらはすべて OS によって送信されるイベントです。

メモリ使用量に関しては...単純なメモリリークがあります。通常の方法で修正します。リークがどこにあるかを把握し、パッチを当てます。あなたのプロジェクトについて詳しく知らなくても、私が言えることはそれだけです。コード内の任意の場所で使用する場合はnew、スマート ポインターへの切り替えを検討してください。

于 2012-08-29T13:08:54.653 に答える
0

あなたが投稿したコードには、何が問題なのかを伝えるコードが多すぎます。

修正できない場合は、ボタン/GUI/何でも使用して単純なループを維持し、時間が来たら、操作 1)、2)、および 3) を実行して終了する新しいプロセスを生成します。派手な GUI が必要ない場合は、プロセスを生成する前にキーストロークを待機するバッチ ファイルを作成することもできます。

このようにして、OS が代わりにリソースを解放します。

于 2012-08-29T12:51:39.553 に答える