• 締切済み

.Netのタイマーについて

現在system.timers.timerを使用しています。 仕様としては、タイムアウト内に電文がこなければ再送するというものです。 Timerの使い方はわかったのですが、その途中で電文受信のイベントを走らすことって無理なのでしょうか? 今、わからないのはタイムアウトになるのを待ってから受信イベントが走っているので、 どうにかタイマーが動いている時でも中止して受信イベントを走らせたいです。 何か方法はありますか? また、どういうふうにした方がいいとかあれば教えてください。 わかりにくい説明になったと思いますがよろしくお願いします。

みんなの回答

回答No.7

うーむTT 徹夜明けです。 すいません。できておりませんT▽T 結構むずいっすね。 また来週チャレンジです。。

okkomu
質問者

お礼

忙しいところすみません。 いつでも良いのでお願いします。

回答No.6

すいません。 現在、業務中にこっそりやっているのですが、ちょっと、かかりそうなので、週末に調べてみますね。 m(_ _)m

okkomu
質問者

補足

ご迷惑をおかけしてすみません。

回答No.5

Dim rcvBytes As Byte() = udp.Receive(remoteEP) を直接呼ばず、タイマをもう一個用意して、タイマイベントで実行するようにしたらどうかな?

okkomu
質問者

補足

すみません・・・。 初心者なものでどうしたら良いのかちょっとわからないです。 ご迷惑おかけします。 下記のページを見つけました。 でも、実際どうしたら良いか・・・って感じで調べてみます・・・。 http://www.users.gr.jp/ml/archive/viewer.aspx?name=cs&no=3372

回答No.4

http://dobon.net/vb/dotnet/internet/udpclient.html ここが参考になりませんか?

okkomu
質問者

補足

お返事ありがとうございます! URLを参照したんですが、 Dim rcvBytes As Byte() = udp.Receive(remoteEP) のときに待機状態になるので、作業ができなくなると思うんです。

回答No.3

すいません、レスがあるのを知りませんでした。 遅れましたが書いておきます ------------------------------------------------------------------ ※TimerEventの変更箇所 ------------------------------------------------------------------ TimerEvent関数をステータスを返すように変更 Public Sub TimerEvent(ByVal sender As Object, ByVal interval As Integer) ↓ Public Function TimerEvent(ByVal sender As Object, ByVal interval As Integer) as boolean 内部のループ内で、受信を行う Do   Windows.Forms.Application.DoEvents()   If Not Status = TimerStatus.timRun Then     TimeOutFlgA = True     Exit Do   End If   'ここで受信チェック   'If 受信ステータス が正常 Then     TimerEvent = True   'End If Loop ------------------------------------------------------------------ ※OutouMachiの変更箇所 ------------------------------------------------------------------ Do While TimeOutFlgA   If TimerEvent(Me, ini.TimeOut) Then     '正常終了     'さらにループ抜け   Else     'タイムアウトカウントを1増やす     TMaxCnt += 1   End If   If ini.MaxCount = TMaxCnt Then     TimeOutFlgA = False     Return   End If Loop

okkomu
質問者

補足

たくさん書いていただきありがとうございます! ひとつわからないことがあるのですが、UDPで通信している場合、受信ステータスのチェックってできるでしょうか? TCPだったらわかったのですが、UDPはわかりません。 どうしたら良いか知っていたら教えて下さい!

回答No.2

以前サンプルを載せた者です。 >Timerの使い方はわかったのですが、その途中で電文受信のイベントを走らすことって無理なのでしょうか? 以前のサンプルそのまんまで、判定処理を通るはずなのですが、、、 DO~LOOPを使用していますか? ループ内で、タイムアウト判定を行っていますか? ループ内に、判定処理を入れてますか? DO~LOOPがタイマイベント内のコードになっていませんよね? もし、以前のサンプルと作りが違うのであれば、現在どうなっているかが想像できません。 現在のコードを公開した方が、解決が早いと思います。

okkomu
質問者

補足

お返事ありがとうございます。 Public Class ClsDa01  Public TimeOutFlgA As Boolean  Private TMaxCnt As Integer  ''応答電文待ち Timer開始  Private Sub OutouMachi()    Dim ini As New IniData    Dim cls As New ClsUDP    TimeOutFlgA = True    ini = cls.GetIniData    Try      Do While TimeOutFlgA        Call TimerEvent(Me, ini.TimeOut)        ''リトライ        TMaxCnt += 1        If ini.MaxCount = TMaxCnt Then          TimeOutFlgA = False          Return        End If      Loop    Catch ex As Exception      Return    End Try  End Sub  ''Timer開始  Public Sub TimerEvent(ByVal sender As Object, ByVal interval As Integer)    Call TimerStart(interval)    TimeOutFlgA = False      Do      Windows.Forms.Application.DoEvents()      If Not Status = TimerStatus.timRun Then        TimeOutFlgA = True        Exit Do      End If    Loop  End Sub End Class これでわかるでしょうか?

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

Timerを正しく使っていれば、他のイベントが走るはずです。 Timerのイベント処理で何を行っているのでしょうか?

関連するQ&A

  • Timerの割り込みイベントをつくりたい

    以前VB .NetでSystem.Timers.Timerのことで質問したものです。 今回、作り直そうと思っているので書き込みました。 したいことは・・・ 1.タイムアウトを3回して電文がこない場合はエラーを返す。 2.タイムアウト内に電文がきた場合はタイマーを中止し、電文処理をする 上記をするにはどうしたら良いですか? 作成にあたりポイントなどありましたら教えて下さい。 よろしくお願いします。

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

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

  • JAVA NetBeans タイマーでのラベル

    MacでNetBeans7.3.1を使ってる初心者です。 タイマーにチャレンジしてるのですが、 出力にはちゃんと表示できてるようですが、 ラベルに表示できなく、エラーがでます。 たぶんラベルの使い方がおかしいんだと思いますがどうすればよいか分かりません。 ご教授よろしくお願い致します。 下記URLはスクリーンショットです。 http://mokkori0710.web.fc2.com/netbeans.jpg public static void main(String args[]) { new NewJFrame().setVisible(true); JLabel jLabel1 = new JLabel(); Timer timer01 = new Timer();//タイマーを作成 timer01.scheduleAtFixedRate(new TimerTask() { int i=0; String str; public void run() { i+=1; str=Integer.toString(i); //jLabel1.setText(str); System.out.println(str); } }, 0, 1000);//時間の間隔 1000=1秒 }

    • ベストアンサー
    • Java
  • Solaris10 スレッドでのタイマー割り込みについて

    さっき載せたつもりがどこかに消えてしまっているようなのでまた書かせていただきます。 Solarisでスレッドごとのアラームのサポート中止が出ており、スレッドでsocket通信中のreadでタイマーを張りたいのですが、どうすればいいのでしょうか。 これまでsetitimer()を使ってきました。 http://docs.sun.com/app/docs/doc/819-0390/6n2qp46er?l=ja&a=view 要件はSolaris10,スレッド,C言語,socket-readでの3秒でのタイムアウト実現。 Solaris/POSIXスレッドを使っている方はこのような場合どうしていらっしゃいますか? どう解決されたかお教えいただければと思います。 自分でタイマースレッドを作るしかないのでしょうか。

  • Tickイベントについての質問

    1秒間のループ回数を得るために下記のようなコードを記述したのですが、Tickイベントが発生せずループから抜けません。以前はVB6(Timer1_Timerイベント)を使用していたのですが、何の問題もなく使用出来ていました。誰か分る方、ご教授下さい。もちろんInterval=1000です。 '1sec間に繰り返されるループ回数 Private mlng1SecTimeCount As Long '1sec経過フラグ Private msht1SecFlg As Short '(省略) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ディレイタイム設定 DELAY_TIME_SETTING() End Sub Private Sub DELAY_TIME_SETTING() 'ディレイタイム設定 '解説:1sec間に実行されるループ回数の算出。 'ループ回数格納用変数 Dim lngLoopCount As Long 'タイマー1起動 Timer1.Enabled = True Do Until msht1SecFlg = 1 lngLoopCount += 1 Loop 'タイマー1停止 Timer1.Enabled = False 'データ保存 mlng1SecTimeCount = lngLoopCount End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick '解説:1sec経過後にインクリメント。 'インクリメント msht1SecFlg += 1 End Sub 以上よろしくお願い致します。

  • メールの受信

    メールがたまりすぎていて、何度受信しようとしても、途中でタイムアウトになってしまい、全部を受信できずに終わってしまいます。 何か原因があるのでしょうか? 教えてください!

  • 自作クラスのイベントを外部ハンドラでスレッドセーフ

    ■.NETモジュールプロジェクト(DLL) Public Class MyClass   Public Event hoge( ByVal sender As Object, ByVal e As EventArgs )   Private WithEvents Timer As Timers.Timer   Private Sub New()     Timer = New Timers.Timer : Timer.Interval = 10 : Timer.Start()   End Sub   Private Sub fuga( ByVal sender As Object, ByVal e As EventArgs ) Handles Timer.Elapsed     RaiseEvent hoge( Me, New EventArgs ) ' 一定時間ごとにイベントを発生させる   End Sub End Class ■上の.NETモジュールを参照している Windows Form アプリケーションプロジェクト(EXE) Public Class Form1   Private WithEvents foo As MyClass.MyClass   Public Sub New()     InitializeComponent()     foo = New MyClass.MyClass   End Sub   Private Sub bar() Handles foo.hoge     TextBox1.Text = "baz" ' TextBox1 は デザイナで Form1 に貼り付け済み   End Sub End Class という 2 プロジェクトを含むソリューションを作成しました。実行すると、 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox1' がアクセスされました。 というエラーが出てきます。 foo が MyClass ではなく、system.windows.forms.dll などに入っている Button や Form といったコントロールの場合は、上記の bar() のような書き方でもスレッドセーフに扱えるので、MyClass もForm1 のコードを修正する事なく、利用できたらなと思っています。 その場合、どのように MyClass を書けばいいでしょうか。環境は VS2008 で、.NET2.0 ベースです。

  • VB2008でフォームに文字列をスクロールさせたい

    VB2008でフォーム上に右~左にフェイドイン、フェイドアウトする 物を作ろうとしてるのですが、どうしてもわからないので書き込みしました。 フォーム1にテキストボックスとボタンがあり、 ボタンを押す事によりテキストボックスの文字列をフォーム2の画面上に 表示し、右~左(HTMLLで言うとキーマー)に動くようにしたいのですが 右からって事は一番右の値が+だと思うのですがフォーム2は大きさを自由に 変更できるので大きさをさらに大きくした場合途中で消えてしまいます。 あと、タイマーでするとタイマーが終わるまで実行できないので 文字が流れてる間もボタンを押す事にyの値を変えて、 複数実行させたいのです。 以下が試しに書いてみたプログラムです。 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim objG As Graphics objG = Form2.CreateGraphics() objG.Clear(Form2.BackColor) objG.DrawString(Text1.Text, Label1.Font, New SolidBrush(Label1.ForeColor), iLight, 50 + Form2.Width) iLight += -1 If iLight < -50 Then Timer1.Stop() End If objG.Dispose() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Interval = 1 Timer1.Start() End Sub すみませんがよろしくお願いします。

  • [AS3]自動的に画像が重なっていくスライドショー

    ASに触れたての初心者です。 Actionscript3.0で、ボタンなどを使わない、ただ画像を順次流すだけのスライドショーが作りたいです。 何もないステージに、まずムービークリップ「Images1」が2秒くらかけて画面上からスライドして来ます。 ステージぴったりに収まった(座標が0,0になった)ところで2秒ほどImages1を見てもらいます。 次に、Images1の上にトランプが重なるように、新たなMC、「Images2」が同じような動作で降りてきます。 これも、ステージにぴたりと合わさったところで2秒ほど静止し、その上からさらに「Images3」が同じような動作で重なっていきます。 これをImages5くらいまで順次重ねていって、不要になった層は適時削除していきたいです。 Images1を「スライドしてくる」「数秒とどまる」「消える」といった動作はできたのですが、それをmages5まで繰り返させるのが全く解りませんでした…。 タイムライン上だけで作ると惜しいものができたのですが、Images5までいってImages1に戻ったときに、Images5の上からImages1を重ねるという操作がわからず、タイムラインで作るのを諦めました。 いったいどのようにスクリプトを組んだら良いのでしょうか? 大変困っています。どなたかお願い致します。 現時点のスクリプトは以下のとおりになります。 import flash.utils.Timer; import flash.display.MovieClip; import flash.events.TimerEvent; //ムービークリップ var Images1:Sprite = new Sprite(); Images1.graphics.beginFill(0x000000); Images1.graphics.drawRect(0, 0,300,-500); Images1.graphics.endFill(); addChild(Images1); //移動 this.addEventListener(Event.ENTER_FRAME,timerfunc); function timerfunc(e:Event):void { Images1.y=Images1.y+10;//スライド if(Images1.y>500)Images1.y=500;//スライドのとまる場所 timer1.start();//タイマースタート } //一定時間待ってから消えるタイマー var timer1:Timer = new Timer(6000,1); timer1.addEventListener(TimerEvent.TIMER, timerHandler1); function timerHandler1(e:TimerEvent):void{ removeChild(Images1); removeEventListener(TimerEvent.TIMER, timerHandler1); removeEventListener(Event.ENTER_FRAME,timerfunc); }

    • ベストアンサー
    • Flash
  • 参考サイトを探しています。

    VB6.0を使っています。 OSはwindows2000です。 text1にtimerで現在時間を表示しています。 何時になったらイベントを発生させると、複数のイベント発生条件を入れられるいうものを作っているのですが、検索のしかたがわかりません。 VB 入門 タイマー 時間 イベント 複数 アラーム などを組み合わせたのですがうまいこと出てこないので参考ページお願いします。 只今こんな感じです Option Explicit Dim SetTime As String ----------------------------------------------------- Private Sub Command1_Click() SetTime = Text2.Text ← 出来れば直接の時間を設定したい。 End Sub ---------------------------------------------- Private Sub Timer1_Timer() Text1.Text = Format(Time, "hh:mm:ss") If Format(Now, "hh:mm") = SetTime Then MsgBox ("設定した時間です " & SetTime) End If End Sub -------------------------------------------- ヨロシクお願いします