- 締切済み
.Netのタイマーについて
現在system.timers.timerを使用しています。 仕様としては、タイムアウト内に電文がこなければ再送するというものです。 Timerの使い方はわかったのですが、その途中で電文受信のイベントを走らすことって無理なのでしょうか? 今、わからないのはタイムアウトになるのを待ってから受信イベントが走っているので、 どうにかタイマーが動いている時でも中止して受信イベントを走らせたいです。 何か方法はありますか? また、どういうふうにした方がいいとかあれば教えてください。 わかりにくい説明になったと思いますがよろしくお願いします。
- okkomu
- お礼率35% (59/167)
- Visual Basic
- 回答数7
- ありがとう数4
- みんなの回答 (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のイベント処理で何を行っているのでしょうか?
関連するQ&A
- Timerの割り込みイベントをつくりたい
以前VB .NetでSystem.Timers.Timerのことで質問したものです。 今回、作り直そうと思っているので書き込みました。 したいことは・・・ 1.タイムアウトを3回して電文がこない場合はエラーを返す。 2.タイムアウト内に電文がきた場合はタイマーを中止し、電文処理をする 上記をするにはどうしたら良いですか? 作成にあたりポイントなどありましたら教えて下さい。 よろしくお願いします。
- 締切済み
- Visual Basic
- タイマーコントロールのイベント処理
VB6SP6を使ってます。 タイマーコントロールで一定間隔に発生させるイベントプロシージャについて以下の点を教えてください。 1.イベント処理に時間を要し、Intervalの値を超えてしまった場合は、また新たな次のイベントが発生するのでしょうか。 もし新規イベントが発生するのでしたらこれまで処理を行ったイベント処理情報は全て破棄されるのでしょうか 2.イベント処理中にEnabledプロパティがFalseとなりタイマーが停止した場合、イベント処理は最後まで完了するのでしょうか。それとも途中で中止され、途中情報は破棄されるのでしょうか 以上、よろしくお願いいたします
- ベストアンサー
- Visual Basic
- 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スレッドを使っている方はこのような場合どうしていらっしゃいますか? どう解決されたかお教えいただければと思います。 自分でタイマースレッドを作るしかないのでしょうか。
- ベストアンサー
- C・C++・C#
- 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 以上よろしくお願い致します。
- ベストアンサー
- Visual Basic
- メールの受信
メールがたまりすぎていて、何度受信しようとしても、途中でタイムアウトになってしまい、全部を受信できずに終わってしまいます。 何か原因があるのでしょうか? 教えてください!
- ベストアンサー
- その他(メールサービス・ソフト)
- 自作クラスのイベントを外部ハンドラでスレッドセーフ
■.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 ベースです。
- ベストアンサー
- Visual Basic
- 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 すみませんがよろしくお願いします。
- 締切済み
- Visual Basic
- [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 -------------------------------------------- ヨロシクお願いします
- ベストアンサー
- Visual Basic
お礼
忙しいところすみません。 いつでも良いのでお願いします。