0
#include <windows.h>

int main()
{

    XFORM blah;
    blah.eM22 = 1.0f;
    blah.eDx = 0.0f;
    blah.eDy = 0.0f;
    blah.eM11 = 1.0f;
    float blahm1 = 0.0;
    float blahm2 = 0.0;
    HDC hdc = CreateCompatibleDC(NULL);
    HBITMAP cross = (HBITMAP)LoadImage(NULL, ("C:\\Documents and Settings\\Death\\My Documents\\45Hand.bmp") ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    HBITMAP crossmask = (HBITMAP)LoadImage(NULL, ("C:\\Documents and Settings\\Death\\My Documents\\45Hand2.bmp") ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    while (1)
    {
        HDC hdc_x = GetDC(HWND_DESKTOP);
        blahm2 = (blahm2 + 0.0001f);
        blah.eM12 = blahm1;
        blah.eM21 = blahm2;
        SelectObject(hdc, cross);
        SetGraphicsMode(hdc_x, GM_ADVANCED);
        SetWorldTransform(hdc_x, &blah);
        BitBlt(hdc_x,512,384,800,703,hdc,0,0,SRCAND);
        ReleaseDC(HWND_DESKTOP,hdc_x);
    }

    return 0;
}

これが非常に遅くなるとは思いませんが、このプログラムの 2 つのインスタンスを一度に実行すると、コンピューター全体が実質的に応答しなくなります。たとえば、このような状況で右クリックすると、メニューに文字通り約 10 秒かかります。現れる。

4

4 に答える 4

3

無限ループ自体が問題になる可能性がありますが、実際の問題 (無限にループさせたいと仮定して) は、それがタイトで無限のループであり、スケジューラーが他のタスクに制御を戻します。

これを解決するには、ループが他のタスクを実行できるようにする必要があります。

「スリープ」は通常、簡単な解決策であり、スレッド間で実際に同期を行うことです。

于 2013-06-10T01:02:33.933 に答える
2

無限ループを削除します。

while (1)
{
    // Repeat this code forever...
}
于 2013-06-10T00:57:13.863 に答える
1

ここで何をしようとしているのか理解できたと思います。しかし、これは Windows プログラムの作成方法ではありません。

このサンプル プログラムを見ると、メッセージを処理するコードが少し含まれていることがわかりWM_PAINTます。それはあなたのコードが行くところです。

編集して追加

描かれたオブジェクトが動いていることに気づきませんでした。したがって、これを行うためのより良い方法の 1 つ:

1)SetTimer()ポジションを更新する必要があるときに自分にメッセージを送信するために使用します

2)メッセージを受け取ったらWM_TIMER、新しい位置を計算して呼び出しますInvalidateRect()(これにより、Windowsに再描画するものがあることが通知されます)

3)WM_PAINTハンドラーで、実際の描画を行います。

これらすべてのポイントは、Windows にスケジューリングを任せ、UI の応答性を維持することです。

于 2013-06-10T01:12:56.860 に答える
1

ここには 2 つのオプションがあります。

  1. 他の人が述べたように、 while ループで、何らかの方法でブレークを追加します
  2. while ループ内で sleep(nb_milliseconds) を使用してスレッドを使用し、CPU リソースの使用をスムーズにします。

2 番目のオプションには、プログラムの 1 つのインスタンスから同時に 2 つの治療インスタンスを実行できるという利点があります。

警告 :スレッドは、コンパイラまたはプラットフォームによって同じように処理されませんが、自分で見つけることができます。

于 2013-06-10T01:02:09.013 に答える