none
2つのタイマーにまたがるデータの利用 RRS feed

  • 質問

  • また、お世話になります。

    現在、画面表示のプログラムで私はSQLを利用してDBにアクセスし、取得したデータを画面に表示するものを制作しました。

    また、要求内容に「1分ごとに画面を切り替えて表示する」ように指定を頂いたので、

    1分ごとにSQLでDBへアクセス、そのデータを利用して切り替わる画面を実装しました。

    しかし、要求の変更で「1分ごとにDBアクセスをしていると負荷がかかりすぎる」ということで、

    DBへのアクセスは30分単位にしてほしいと言われました。

    但し、画面変更は1分ごとなのは変わりません。

    timer1 = 30分 timer2 = 1分 を用意し、実装すればよいと考えたのですが、

    30分おきに取得したデータをtimer2に反映させる方法が思いつかないのです。

    業務の都合上、ソースを載せることができないので私の拙い説明での質問になりますが…

    どなたか、アドバイスをいただければ幸いです。

    よろしくお願いします。

    追記:環境

    OS:Windows7 Pro 

    作成しているもの:Windows Forms(Visual Studio 2013)

    DB:Oracle DB 11g

    追記2

    みなさんに回答や指摘をいただき、とてもありがたいのですが

    自分の説明が追いつかない、作成している物に対する理解が追いついていない

    ということで、1度内容を整理し、その際に再び疑問が生じたら質問させていただこうと思います。

    指摘回答を下さった皆様、申し訳ありません。ありがとうございました。


    • 編集済み Ratios 2016年7月15日 4:30
    2016年7月15日 0:54

回答

  • つまりタイマーの外にSQLをおいて、カウンターが30になる=30分経過したらタイマーのループを抜け出してSQLを読み取りに行く、ということでしょうか?

    SQLはどこにあってもよいのですが、今あるロジックでやりやすいようにすれば良いです。例えば、以下のような感じが考えられます。
    int counter = 30;
    
    public void Tickイベント(object sender, EventArgs e)
    {
        if (counter == 30)
        {
            SQLでデータを読み込み、変数にデータを渡す。
        
            couneter = 0;
        }
    
        画面①と画面②を交互に表示する
        
        counter++;
    }
    
    今のロジックがどうなっているとか、今後、どのようにしていきたいのかによって、タイマーを2つ使う方法の方が良い場合もあります。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク Ratios 2016年7月15日 5:45
    2016年7月15日 4:35
    モデレータ

すべての返信

  • 単純に考えればタイマーは1つでよく、1分ごとに画面を更新すると同時にカウンターを1ずつ上げていき、30になったらSQLを発行してデータを取得し、その後に画面を更新し、カウンターを0にリセットし、その後、またこのルーチンを繰り返すということでいいんじゃないかと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年7月15日 1:23
    モデレータ
  • > DBへのアクセスは30分単位にしてほしいと言われました。
    > 但し、画面変更は1分ごとなのは変わりません。

    30 分毎に DB から情報を取得するということは、30 分間はずっと同じ情報になるはずで、同じ情報で 1 分ごとに画面を書き換えても意味はないと思うのですが、どういうことですか?

    それはともかく、

    > 30分おきに取得したデータをtimer2に反映させる方法が思いつかないのです。

    という必要はなくて、「timer1 = 30分」で DB からデータを取得したら、そのデータで画面を更新すれば済むと思うのですが。そうできない理由は何かあるのですか?


    #前にも聞かれたと思いますが何を作っているのか(Windows Forms? WPF? ASP.NET Web Forms? その他?)書きましょう。また、ご自分の環境(OS, .NET, Visual Studio のバージョン、DB サーバーとそのバージョン、ASP.NET Web アプリなら IIS とブラウザの情報なども)も書いていただけませんか?
     
    #適切に情報が提供されていれば、回答者が質問者さんの状況を的確に把握でき、タイムリーで的を得た回答が得られるということで、質問者さんにもメリットがあります。ガイドラインも出ていますので目を通していただければと思います。
     
    フォーラムのご利用方法(質問の投稿)について
    https://social.msdn.microsoft.com/Forums/ja-JP/b2074c04-2e91-414d-8e9e-d634be311e31


    • 編集済み SurferOnWww 2016年7月15日 1:27 誤字訂正
    2016年7月15日 1:25
  • 大変失礼しました。質問することばかり頭にいっていて、

    環境を記載することを忘れてしまうのはいけませんね…。

    ご指摘ありがとうございます。

    開発しているのはとある物の進捗状況を表す画面で、

    30分ごとにSQLからデータを読み取る→変数に渡す→画面①と画面②を交互に表示する(1分ごと)

    という内容です。

    画面①と画面②は表示上の画面構成は等しいものですが、表示されるデータの中身は異なっています(例:①が時間帯累計、②が日累計のような)

    わかりずらい説明で申し訳ありません。

    2016年7月15日 2:07
  • 単純に考えればタイマーは1つでよく、1分ごとに画面を更新すると同時にカウンターを1ずつ上げていき、30になったらSQLを発行してデータを取得し、その後に画面を更新し、カウンターを0にリセットし、その後、またこのルーチンを繰り返すということでいいんじゃないかと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    つまりタイマーの外にSQLをおいて、カウンターが30になる=30分経過したらタイマーのループを抜け出してSQLを読み取りに行く、ということでしょうか?

    2016年7月15日 2:09
  • ますます分からなくなってきたのですが・・・

    今までは「timer2 = 1分」の Tick で、

    1分ごとにSQLからデータを読み取る→変数に渡す→画面①と画面②を交互に表示する

    と言う操作をしてきたのでしょうか? そして、そこまでは問題なく完成しているのでしょうか?

    であれば、

    (1) 「timer1 = 30分」の Tick で、SQLからデータを読み取る→変数に渡す

    (2) 「timer2 = 1分」の Tick で、変数からデータを取得して画面①と画面②を交互に表示する

    というようにすれば(最初の私のレスと同じ)、最小限の修正で、

    > 30分ごとにSQLからデータを読み取る→変数に渡す→画面①と画面②を交互に表示する(1分ごと)

    とすることができると思うのですが?

    もしくは trapemiya さんの案を参考に、

    (1) SQLからデータを読み取る→変数に渡す

    (2) 「timer2 = 1分」の Tick で、変数からデータを取得して画面①と画面②を交互に表示する

    (3) 上記 (2) を 30 回行ったら、再度上記 (1) を実行する

    でもよさそうです。

    それではダメならその理由を詳しく教えてください

    2016年7月15日 3:03
  • Hoshinaです
    深読みします。

    1分の処理を開始すると、ずっとその処理の中にいて終わりようが無いので、
    30分の別の処理をどうやって始めたらよいのか分からないということでしょうか?

    2016年7月15日 4:10
  • 申し訳ありません、ちょっと説明が追いつかないというか思いつかないというかなので、

    一度整理してそれでなお不明だった際に改めて質問させていただくことにします。

    指摘・回答例ありがとうございました。

    2016年7月15日 4:28
  • つまりタイマーの外にSQLをおいて、カウンターが30になる=30分経過したらタイマーのループを抜け出してSQLを読み取りに行く、ということでしょうか?

    SQLはどこにあってもよいのですが、今あるロジックでやりやすいようにすれば良いです。例えば、以下のような感じが考えられます。
    int counter = 30;
    
    public void Tickイベント(object sender, EventArgs e)
    {
        if (counter == 30)
        {
            SQLでデータを読み込み、変数にデータを渡す。
        
            couneter = 0;
        }
    
        画面①と画面②を交互に表示する
        
        counter++;
    }
    
    今のロジックがどうなっているとか、今後、どのようにしていきたいのかによって、タイマーを2つ使う方法の方が良い場合もあります。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク Ratios 2016年7月15日 5:45
    2016年7月15日 4:35
    モデレータ
  • つまりタイマーの外にSQLをおいて、カウンターが30になる=30分経過したらタイマーのループを抜け出してSQLを読み取りに行く、ということでしょうか?

    SQLはどこにあってもよいのですが、今あるロジックでやりやすいようにすれば良いです。例えば、以下のような感じが考えられます。
    int counter = 30;
    
    public void Tickイベント(object sender, EventArgs e)
    {
        if (counter == 30)
        {
            SQLでデータを読み込み、変数にデータを渡す。
        
            couneter = 0;
        }
    
        画面①と画面②を交互に表示する
        
        counter++;
    }
    
    今のロジックがどうなっているとか、今後、どのようにしていきたいのかによって、タイマーを2つ使う方法の方が良い場合もあります。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    どう説明しようかなんて考えていたら、わざわざコード例をあげていただいておりました。

    参考にして試したところ、理想通りの動きが無事実装できました…

    非常に拙くわかりずらい説明のなか、意図を汲み取ってお答えを示していただき、ありがとうございました!

    2016年7月15日 6:02