- 締切済み
.Netのタイマーについて
現在system.timers.timerを使用しています。 仕様としては、タイムアウト内に電文がこなければ再送するというものです。 Timerの使い方はわかったのですが、その途中で電文受信のイベントを走らすことって無理なのでしょうか? 今、わからないのはタイムアウトになるのを待ってから受信イベントが走っているので、 どうにかタイマーが動いている時でも中止して受信イベントを走らせたいです。 何か方法はありますか? また、どういうふうにした方がいいとかあれば教えてください。 わかりにくい説明になったと思いますがよろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
うーむTT 徹夜明けです。 すいません。できておりませんT▽T 結構むずいっすね。 また来週チャレンジです。。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
すいません。 現在、業務中にこっそりやっているのですが、ちょっと、かかりそうなので、週末に調べてみますね。 m(_ _)m
補足
ご迷惑をおかけしてすみません。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
Dim rcvBytes As Byte() = udp.Receive(remoteEP) を直接呼ばず、タイマをもう一個用意して、タイマイベントで実行するようにしたらどうかな?
補足
すみません・・・。 初心者なものでどうしたら良いのかちょっとわからないです。 ご迷惑おかけします。 下記のページを見つけました。 でも、実際どうしたら良いか・・・って感じで調べてみます・・・。 http://www.users.gr.jp/ml/archive/viewer.aspx?name=cs&no=3372
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
http://dobon.net/vb/dotnet/internet/udpclient.html ここが参考になりませんか?
補足
お返事ありがとうございます! URLを参照したんですが、 Dim rcvBytes As Byte() = udp.Receive(remoteEP) のときに待機状態になるので、作業ができなくなると思うんです。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
すいません、レスがあるのを知りませんでした。 遅れましたが書いておきます ------------------------------------------------------------------ ※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
補足
たくさん書いていただきありがとうございます! ひとつわからないことがあるのですが、UDPで通信している場合、受信ステータスのチェックってできるでしょうか? TCPだったらわかったのですが、UDPはわかりません。 どうしたら良いか知っていたら教えて下さい!
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
以前サンプルを載せた者です。 >Timerの使い方はわかったのですが、その途中で電文受信のイベントを走らすことって無理なのでしょうか? 以前のサンプルそのまんまで、判定処理を通るはずなのですが、、、 DO~LOOPを使用していますか? ループ内で、タイムアウト判定を行っていますか? ループ内に、判定処理を入れてますか? DO~LOOPがタイマイベント内のコードになっていませんよね? もし、以前のサンプルと作りが違うのであれば、現在どうなっているかが想像できません。 現在のコードを公開した方が、解決が早いと思います。
補足
お返事ありがとうございます。 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)
Timerを正しく使っていれば、他のイベントが走るはずです。 Timerのイベント処理で何を行っているのでしょうか?
お礼
忙しいところすみません。 いつでも良いのでお願いします。