• 締切済み

.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のイベント処理で何を行っているのでしょうか?