none
一定時間,処理を待つときに,CPUに負荷をかけずに待つ方法はありませんか? RRS feed

  • 質問

  • いつもお世話になります。

    webBrowser コントロールを使って,フォームに自動入力するプログラムを作っています。

    たとえば,ヤフーオークションに出品するために,プログラムでフォームにを自動入力し,[続ける]ボタンを押し,確認画面が表示されたら,[出品する]ボタンを自動でクリックするプログラムを作るとします。

     

    今は,以下のようなコードを書いています。ボタンを押す部分だけ,書きます。

     

    Code Snippet

    private void 出品()
    {
        // 続けるボタンを押します。
        flag = true;
        続けるボタン.InvokeMember("click");
        // 次の画面を読み込むまで待つ
        do
        {
            Application.DoEvents();
        } while (flag == true);
        // 出品するボタンを押します。
        flag = true;
        出品するボタン.InvokeMember("click");

        // 次の画面を読み込むまで待つ
        do
        {
            Application.DoEvents();
        } while (flag == true);
    }

    // webBrowser DocumentComplete イベント処理
    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDoccumentCompletedEventArgs e)
    {
        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            // 読み込みが完了していたら flag に false を設定
            flag = false;
        }
        else
        {
            flag = true;
        }
    }
     

     

    上記は,エラーチェックや,タイムアウト処理などは省いています。

    いちおう期待通りの動作はするのですが,ボタンを押した後の画面遷移に,たとえば30秒ほど時間がかかると,ループしている部分でCPU使用率が高くなってしまい,結果CPUが発熱してしまいます。

     

    Sleep を使ったり,いろいろ試してみたのですが,自分では問題を解決することが出来ず,相談させていただきました。

    CPU に極力負荷をかけないウェイトの方法があれば,ご教授いただければ幸いです。

    よろしくお願いいたします。

    2008年2月1日 14:56

回答

  • 処理が終わるのをループで待つということがよくありません。
    (DoEventsは何が起こるか分からないため危険かもしれません)
     
    webBrowser1_DocumentCompletedの中で今の状態を判断して、要求するようなコードにしてみては?
    1回目の読み込み、2回目の読み込み、3回目の読み込みといったように処理を分けるとか。
    2008年2月1日 15:20
    モデレータ

すべての返信

  • 処理が終わるのをループで待つということがよくありません。
    (DoEventsは何が起こるか分からないため危険かもしれません)
     
    webBrowser1_DocumentCompletedの中で今の状態を判断して、要求するようなコードにしてみては?
    1回目の読み込み、2回目の読み込み、3回目の読み込みといったように処理を分けるとか。
    2008年2月1日 15:20
    モデレータ
  • Azulean さん,早速のご回答ありがとうございます。

    おっしゃるとおりの方法で,対応することができそうです。

    複数のサイトのオートパイロットを実現したいので,サイトごとの処理の振り分けが大変そうですが,頑張ってみます。

    他に妙案がありましたら,ぜひお聞かせください。

    2008年2月1日 15:39