none
Formが重いのを何とかしたいのですが RRS feed

  • 質問

  • お世話になります。

    楽天RSSを使って株価を読み込み、自動売買するシステムをC#を使って作成しました。

    株価、約定価格、利益率、損益額等の取引情報を、LisrViewに表示させていますが、

    なぜか動作が重く、自動売買そのものは正常に動作するのですが、

    他のウインドウとの切り替えがスムーズに行かず、困っております。

    なお、内部のコーディングの状況を簡単にお伝えしますと、マルチスレッドにするところを

    かわりにWindows.Form.Timerを使っています。(15個ほど)

    もしかしたら、これが原因かとは思っておりますが、

    アドバイスをよろしくお願いいたします。


    • 編集済み なち 2012年10月5日 8:28
    2012年10月5日 7:49

回答

  • 「Windows.Form.Timerが原因か」とのお話しですが、
    その15個のタイマーが各々何を処理しているのか気になります。

    その内容によっては、15個の内のどれかが原因なのか、
    それとも合わさって遅いのかが変わってくると思いますので・・・

    • 回答の候補に設定 佐伯玲 2012年10月12日 1:25
    • 回答としてマーク 佐伯玲 2012年10月16日 7:27
    2012年10月5日 8:13
  • Windows.Form.TimerはメッセージループによるのでUIスレッド上で動作しますから、15個同時に動いているとウインドウ操作と重なって、重くなる原因になっているのかもしれません。別スレッドで動作するSystem.Threading.Timerを試されてみてはいかがでしょうか?

    タイマにより一定時間間隔で処理を行うには?(スレッド・タイマ編)
    http://www.atmarkit.co.jp/fdotnet/dotnettips/373threadtimer/threadtimer.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐伯玲 2012年10月12日 1:25
    • 回答としてマーク 佐伯玲 2012年10月16日 7:27
    2012年10月5日 8:24
    モデレータ
  • 15 個もタイマーが必要なのかという点で、現状の設計が妥当なのかを疑っています。
    15 個もスレッドタイマーで回してしまうと、ロジックやインターバルによっては CPU コアをすべて使ってしまい、アプリだけでなく、OS 全体としてもっさりする可能性があります。
    何が重要なのか、そしてそれを実現するために最適な実現方法は何かから見つめ直した方がよいと思います。

    // 15 個もタイマーを同時に稼働させる事案はそんなに多くないと予想します。
    // その前提で設計・実装技法の紹介を求めても答えを得られない可能性があります。

    • 回答の候補に設定 佐伯玲 2012年10月12日 1:25
    • 回答としてマーク 佐伯玲 2012年10月16日 7:27
    2012年10月5日 15:00
    モデレータ

すべての返信

  • 「Windows.Form.Timerが原因か」とのお話しですが、
    その15個のタイマーが各々何を処理しているのか気になります。

    その内容によっては、15個の内のどれかが原因なのか、
    それとも合わさって遅いのかが変わってくると思いますので・・・

    • 回答の候補に設定 佐伯玲 2012年10月12日 1:25
    • 回答としてマーク 佐伯玲 2012年10月16日 7:27
    2012年10月5日 8:13
  • Windows.Form.TimerはメッセージループによるのでUIスレッド上で動作しますから、15個同時に動いているとウインドウ操作と重なって、重くなる原因になっているのかもしれません。別スレッドで動作するSystem.Threading.Timerを試されてみてはいかがでしょうか?

    タイマにより一定時間間隔で処理を行うには?(スレッド・タイマ編)
    http://www.atmarkit.co.jp/fdotnet/dotnettips/373threadtimer/threadtimer.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐伯玲 2012年10月12日 1:25
    • 回答としてマーク 佐伯玲 2012年10月16日 7:27
    2012年10月5日 8:24
    モデレータ
  • aviator_様、trapemiya様

    お世話になります。

    ご回答ありがとうございます。

    ひとまず、すべてSystem.Threading.Timerとしてみます。

    結果がわかりましたら、またご報告申し上げます。

    2012年10月5日 8:30
  • すみません。

    さらに本件に関連し、以下をご指導いただけないでしょうか。

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

    ■ご指導いただきたい内容■

    System.Threading.Timerの使い方はわかりましたが、

    なにぶん15個もあるので、できればクラス化して使いたいのですが、

    その場合のサンプルをお示しいただけないでしょうか。

    当方、ITが専門でないため、C++/C#等に精通されたプログラマの方々が、

    本件についてどのようなコーディングをするか、見本を見せていただきたく

    思っております。

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

    2012年10月5日 8:49
  • 15 個もタイマーが必要なのかという点で、現状の設計が妥当なのかを疑っています。
    15 個もスレッドタイマーで回してしまうと、ロジックやインターバルによっては CPU コアをすべて使ってしまい、アプリだけでなく、OS 全体としてもっさりする可能性があります。
    何が重要なのか、そしてそれを実現するために最適な実現方法は何かから見つめ直した方がよいと思います。

    // 15 個もタイマーを同時に稼働させる事案はそんなに多くないと予想します。
    // その前提で設計・実装技法の紹介を求めても答えを得られない可能性があります。

    • 回答の候補に設定 佐伯玲 2012年10月12日 1:25
    • 回答としてマーク 佐伯玲 2012年10月16日 7:27
    2012年10月5日 15:00
    モデレータ
  • Azuleanさま

    鋭い回答ありがとうございます。

    参考にさせていたきます。

    2012年10月5日 15:11
  • 返信各位様

    その後、いろいろ試した結果(タイマorスレッドのインターバル時間の見直し等も含む)、

    以下の結果となりました。

    ■Windows.Form.Timerの方が、System.Threading.Timerよりも速い

    ■Windows.Form.Timerのインターバル時間の適切化を行ったところ、CPU負荷が大幅に低減し、現在は問題なく動作

    ここで一つお聞きしたいのですが、Windows.Form上での動作がベースとなる場合は、上記のようにSystem.Threading.TimerよりもWindows.Forms.Timerの方が速くなるのでしょうか?

    なお、System.Threading.Timerは、この後の本フォーラムの質問 「System.Threading.Timerでの質問」のiwanaga様の回答を参考(といいますかほとんどそのままですが。。。)にさせていただき、以下のクラスをインスタンス化して使用させていただいております。

            public class TimerWrapper
            {
                public int Initial;
                public int Interval;
                public event Action Callback;

                private System.Threading.Timer _timer;

                //public TimerWrapper(int period)
                //{
                //    _timer = new System.Threading.Timer(state =>
                //    {
                //        var c = Callback;
                //        if (c != null) c();
                //    }, null, 0, period);
                //}

                public TimerWrapper()
                {
                    Initial = 0;
                    Interval = 100;
                }

                public void Start()
                {
                    _timer = new System.Threading.Timer(state =>
                    {
                        var c = Callback;
                        if (c != null) c();
                    }, null, Initial, Interval);
                }

                public void Stop()
                {
                    _timer.Change(
                        System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
                }
            }

    以上ご教示よろしくお願いいたします。

    2012年10月18日 7:49
  • 返信各位様

    その後、いろいろ試した結果(タイマorスレッドのインターバル時間の見直し等も含む)、

    以下の結果となりました。

    ■Windows.Form.Timerの方が、System.Threading.Timerよりも速い

    ■Windows.Form.Timerのインターバル時間の適切化を行ったところ、CPU負荷が大幅に低減し、現在は問題なく動作

    ここで一つお聞きしたいのですが、Windows.Form上での動作がベースとなる場合は、上記のようにSystem.Threading.TimerよりもWindows.Forms.Timerの方が速くなるのでしょうか?

    なお、System.Threading.Timerは、この後の本フォーラムの質問 「System.Threading.Timerでの質問」のiwanaga様の回答を参考(といいますかほとんどそのままですが。。。)にさせていただき、以下のクラスをインスタンス化して使用させていただいております。

     これまでに書かれている内容が、あまりにも漠然としていて、何を答えたら良いのかわかりません。

     「マルチスレッドととするところを15個のタイマーを使用」とのことですが、何故マルチスレッドにした方が良いと思われているのでしょうか。
     Azuleanさんの質問とかぶりますが、15個のタイマーが本当に必要なのでしょうか。それぞれのタイマーのインターバルと、処理の内容はここに書けますか?後に「最適化した」とのことですが、最適化した結果、どのようになったのでしょうか。
     「Windows.Forms.Timer の方が System.Threading.Timer よりも速い」とのことですが、どのような処理を、どのように計測して、それぞれどのような結果を得て、そのような判断を下されたのでしょうか。「速い」の基準がわからないので、「速くなるのでしょうか?」といわれても、質問の対象がなんなのかわかりません。

     エンジニアは、原因と過程と結果を積み重ねて検証します。結果だけ書かれても判断のしようがありません。でもそれは、IT 職だけでなくすべての職業で同じではないでしょうか。たとえば、「穴子よりもウナギの方がうまい」と言ったとき、そのまま納得しますか?どちらも調理方法によって味が変わらないでしょうか。


    Jitta@わんくま同盟


    • 編集済み Jitta 2012年10月18日 12:27
    2012年10月18日 12:26