• ベストアンサー

Timerイベントについて

ある処理を30秒おきに実行します。その結果が正常終了するまで繰り返します。正常終了すれば次の処理へ移ります。が、5分間正常終了しなければ次の処理に移るというロジックを考えているのですが、思いつきません。 現在、Timerコントロールを使用してます。TimerをONには出来ますが、処理が自動的に次の処理へ移ってしまう状況です。Timerイベントを走らせた後に結果が分かるまで処理を一時中断したいんです。どなたか助言をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。 フラグを使えば良いと思います。 グローバル変数を1つ用意します。(例:FLAG) ----タイマー内---- ~いろんな処理~ FLAG = 1 ----メイン内---- FLAG = 0 ~ここでFLAG=0の間ループする~ do DoEvents until (FLAG<>0) 最近VBは使ってないので命令語忘れてます(^^; 命令が違う、記述が誤ってるなどご容赦ください(.. 参考になれば幸いです(..

peugeot
質問者

お礼

ありがとうございます。この方法でうまく動きました。

その他の回答 (1)

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.2

タイマーイベントは、イベントが動いてる間は、割り込みが発生しないはずです。 つまり、実行中のイベントが 終わってから発生します。 あと フラグを設けて、そのフラグによって処理するかしないか判断したらいいでしょう。

peugeot
質問者

お礼

ありがとうございます。この方法でうまく行きました。

関連するQ&A

  • Timer関数の中のFor文の処理

    Timer関数とFor文の使い方について質問です。 例えばTimer関数のインターバルを1秒に設定をします。 そして、Timer関数の処理の中で5秒以上処理のかかるFor文を書いたとします。 その場合、Timerはスタートしてから1秒後にまた最初からFor文の処理を始めるのでしょうか。 それとも5秒以上処理のかかるFor文の処理が終わってから次のTimerの処理に移行するのでしょうか。 もしくは、1秒毎に新たに並列にTimerの処理がスタートして行くのでしょうか。 以上です。よろしくお願いします。

  • Timerのカウントダウンのしかたを教えて下さい!

    カウントダウンさせるプログラムを作っているのですが、「Timer」を使用して「1秒毎」にカウントダウンさせていきたいんですけど「テキスト」内の数値を[0・・59・・58・・」の順にカウントさせることは可能ですか? 現時点では「Timer」を設置してボタン操作でカウントを始めるプログラムを書きましたが、どうも計算がうまくいきません。 Public Class Form1 Private SecCount As Integer ' 秒数をカウントする整数 Private Count As Integer Private WaitSecond As Integer ' タイマーの停止時間を秒単位で記憶する変数 ' [START]ボタンを押した時に実行する処理 Private Sub DoConvert(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click Dim WorkingMinute, WorkingSecond As Integer Dim WorkingHour As Integer Dim Smhplass As Integer ' 時間をカウントする変数 ' 入力された時間と分と秒を数値に変換 WorkingHour = numHour.Value WorkingMinute = numMinute.Value WorkingSecond = CInt(txtSecond.Text) ' 指定されたタイマーを秒単位で記憶 WaitSecond = WorkingHour * 60 + WorkingMinute * 60 + WorkingSecond ' 指定されたタイマー停止時間が 0 秒のときは開始処理をキャンセル If WaitSecond = 0 Then Exit Sub End If ' 秒数のカウントと表示をテキスト内の表示にに初期化 SecCount = WorkingHour + WorkingMinute Count = 0 ' カウンターを処理する変数 Smhplass = WorkingSecond + WorkingMinute + WorkingHour ' numからテキストに表示 txtHour.Text = WorkingHour.ToString() txtMinute.Text = WorkingMinute.ToString() ' [START]ボタンを無効化 btnStart.Enabled = False ' タイマーを開始 Timer1.Start() ' 表示画像の変更 lblStandby.Text = "START" End Sub ' 指定したミリ秒毎に実行される処理 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim Smhplass As Integer ' 時間をカウントする変数 Dim WorkingHour, WorkingMinute, WorkingSecond As Integer ' テキストをIntに変える変数 WorkingHour = CInt(txtHour.Text) WorkingMinute = CInt(txtMinute.Text) WorkingSecond = CInt(txtSecond.Text) ' カウンターを処理する変数 Smhplass = WorkingHour - WorkingMinute - WorkingSecond ' タイマーカウント行う処理 SecCount = SecCount - 1 Smhplass = SecCount If SecCount = WaitSecond Then ' 表示画像を変更 lblStandby.Text = "STANDBY" ' タイマーを停止 Timer1.Stop() ' [START] ボタンを有効化 btnStart.Enabled = True End If End Sub End Class 上記がボタンを押した時の処理とタイマーイベント(Tick)が行う処理の記述のつもりなのですが、ここからどういう計算方式で「0・・59・・58」の順に減らしていくのかわかりません(ι・_・) デザインではテキストが「時間・分・秒」の順に表示される様に設定しています、そこに表示させたテキストの「分・秒」を先ほどの計算式で逆算していきたいです。 たとえば1時間に設定したら「秒」のカウントは「59」から始まり「分」はそれに伴って秒が60カウントをした「1分」ずつ減っていくような感じです。 Name設定を変えているのでボタンやテキストの表記が多少変わっていて読みにくいかもしれませんが「ボタン」なら「btn~」、テキストなら「txt~」で名前をつけています。 長くなってしまいましたが、もしいい方法があれば是非ご伝授の方よろしくお願いします。

  • マウスをクリックしたときのイベント

    VisualC++2010のButton Controlのイベントについて 「BN_CLICKED」イベントはマウスをクリックして、放した時に発生します。 クリックしたときのイベントは取れないのでしょうか? *設定時間、押しっぱなしで、次の処理に移るというプログラムを書きたいため  悩んでいます。

  • C#でスレッド実行中のイベントについて

    メインフォームの「処理開始ボタン」をクリックすると別スレッドが起動して、そのスレッド中で重たい処理をさせ、処理中に「中断ボタン」をクリックすると中断してアイドル状態に戻る様なプログラムについてですが、 先ず、Invokeを使わずに直接スレッドを起動すると期待通りの動作となり、Thread.Sleep()中でもボタンクリックのイベントが発生します。 しかし、Invokeとデリゲートを使ったスレッドを起動させるとスレッドの処理が終了するまでイベントが発生せず、行ったきり状態になってしまいます。 処理ループ内にAplication.DoEvent()を入れるとイベントが発生する様になりますが、Thread.Sleep()中はフリーズ状態となります。 Invokeを使ったスレッドでも、Invokeを使わない場合と同じ動作をさせる方法があれば教えて頂けないでしょうか。 どうぞ宜しくお願いします。

  • [VB.NET]Windowsアプリに、Page_PreRenderイベントは存在するか

    VB.NET2003,2005についての質問です。 下記の処理を、Windowsアプリケーションで実現することは可能でしょうか。   ・各コントロールのイベントで、メンバ変数であるフラグAに、値を設定する処理を行う。   ・各コントロールのイベントが「終了後」、このフラグAの内容によって、処理Bを実行したい。     例)ボタンクリックイベント→処理B       テキストチェンジイベント→処理B     ※各コントロールのイベントには、フラグAの判定処理を組み込まない 上記の処理は、ASP.NETであれば、Page_PreRenderイベントを利用することで実現できました。 Windowsアプリケーションには、ASP.NETにおける、Page_PreRenderイベントのようなものは存在するでしょうか。 存在しなければ、どのような方法で上記の処理を実現できるでしょうか。 以上、どうぞよろしくお願い致します。

  • Timerコントロールによる動作の時間間隔設定について

    よろしくお願いします! ある常駐プログラムを作成し、操作者があらかじめ指定した時間ごとに 画像を保存するという設定にしています。 Timerコントロールで直接時間間隔を指定するとIntervalが最大60000くらい らしいので、まずLabel1にInterval1000で時計を表示して、次にLabel2に もLabel2.caption=timeで時刻を表示します。 操作者が仮に2分ごとに画像を取ると指定した場合は、 Label2の時刻にDateAddで("s",120,TimeValue(label2.caption))した時刻と Label1の時刻が同じになったら画像を取るというコードにしてます。 で、画像を取ると同時にLabel2.caption=timeでLabel2の値を現在時刻に し、また繰り返し2分足したものとLabel1.captionが同じになるのを 待って画像を取ります。 これを繰り返して指定した時間間隔で画像を取るようにしていまして、 ちゃんと動作するのですが、なぜか時計が23:59:57くらいで Label2の方の表示が止まってしまうのです。 Label1の方はTimerで1秒ごとにちゃんと時計を表示し続けている のですが、Label2だけ0時直前で必ず止まってしまいます。 何か日付が変わると表示ができなくなるような決まりがあるのでしょうか。 色々と試したのですが、ここだけが分かりません。 ご教授お願いいたします! また、私のやり方以外に何か時間間隔を指定する良いコードが ございましたら教えていただけますでしょうか? 例えばTimerコントロールを1分ごとに起動して、3分なら3回カウント させるような方法もどこかで目にしたのですが、操作者が指定する 時間間隔は秒単位にしているので、3秒であったり、120秒(2分)で あったり様々です。 その場合の方法がよく分からないので、最初に書いた方法でコードを 書いています。 よろしくお願いします!!!

  • タイマーコントロールのイベント処理

    VB6SP6を使ってます。 タイマーコントロールで一定間隔に発生させるイベントプロシージャについて以下の点を教えてください。 1.イベント処理に時間を要し、Intervalの値を超えてしまった場合は、また新たな次のイベントが発生するのでしょうか。 もし新規イベントが発生するのでしたらこれまで処理を行ったイベント処理情報は全て破棄されるのでしょうか 2.イベント処理中にEnabledプロパティがFalseとなりタイマーが停止した場合、イベント処理は最後まで完了するのでしょうか。それとも途中で中止され、途中情報は破棄されるのでしょうか 以上、よろしくお願いいたします

  • C++ Thread::Sleep()について

    RunTimer = gcnew Timer(); RunTimer->Interval = 50; RunTimer->Tick += gcnew EventHandler(this, &RunTick); RunTimer->Enabled = true; ・・・処理・・・ RunTimer->Enabled = false; System::Threading::Thread::Sleep(1000); としているのですが、数コマ動いてしまいます。 処理は3枚の画像を差し替えて動かしているのですが、即座にスリープがかからず、 画像が少し歪んでしまいます。 ソースが長く、どこを記載すれば良いのか解らず、かなり抜粋しましたが、 TimerのTickで画像を入れ替えて、歩いている様にみせかけています。 一時停止後、改めて処理を始めようと思っているのですが、 なぜだか、少し動いてしまします。 Sleepを削除すると、うまく止まるのですが、即座に次の処理に移行してしまう為、数秒停止させたいと考えています。 System::Threading::Thread::Sleep(1000); だけでは、即座に止める事はできないものでしょうか? また、TimerのTickを数秒止める事はできるものでしょうか? ご存じの方、アドバイスよろしくお願いいたします。

  • Socket通信で、通信終了のイベントが発生しない

    クライアント(Windows)とサーバ(Unix)とSocket通信をするアプリを作っています。処理内容はクライアントのデータファイルをサーバに送信(アップデイト)し、サーバ側でデータを解析し、その結果を印刷するという手順です。 WinSockを使って、送信そのものはうまくいくのですが、サーバでデータを解析し結果を印刷するのに時間がかかり(10秒以上)、その間は送信終了のイベントが発生しません。これはサーバ側での処理を exec関数とwait関数で行っているので、正しい事態なのですが、データの送信が終わったら後はサーバ側で勝手にやって欲しいのです。サーバでの処理を system関数に置換えたり、バックグランド処理にしてもやはり処理が終わるまで送信終了のイベントが発生しません。何かいい方法をお教えください。

  • ASP.NETでTimerコントロールを使用したい

    ASP.NETWebアプリケーションについての質問です。 ajaxのTimerコントロールでイベントを発生させ、画面の再描画をしようとしています。 コードは以下のような感じで、OnPreRenderイベント内で描画処理を行います。 Partial Public Class _Default Inherits System.Web.UI.Page Private str As String = "" Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load str = CStr(Date.Now) End Sub Protected Overrides Sub OnPreRender( _ ByVal e As System.EventArgs _ ) Label1.Text = str End Sub End Class Timerコントロールを配置して実行したところ、 Script controls may not be registered before PreRender. というエラーが出てしまいます。 調べてみたのですが原因がわかりません。 何かプロパティの設定などが必要なのでしょうか? aspx のコードは以下のとおりです。 <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplication5._Default" %> <%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TagPrefix="asp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" ></asp:ScriptManager> <asp:Timer ID="Timer1"runat="server"></asp:Timer> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Labe> l </form> </body> </html> 回答よろしくお願いいたします。

    • ベストアンサー
    • AJAX

専門家に質問してみよう