■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
|
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った): |
■ ページの共有: |
[ サイト内検索 ]
![]()
カスタム検索
|
#11114-0Do..Loopステートメント中のイベントについてDora1999-12-07(火) 17:03
#11127-0RE#11114:Do..Loopステートメント中のイベントについてVB戦士1999-12-07(火) 18:13
#11129-0RE#11127:Do..Loopステートメント中のイベントについてDora1999-12-07(火) 18:32
#11132-0RE#11114:Do..Loopステートメント中のイベントについて暗号君1999-12-07(火) 18:49
#11149-0RE#11114:Do..Loopステートメント中のイベントについてボーラード1999-12-07(火) 21:25
#11127-0RE#11114:Do..Loopステートメント中のイベントについてVB戦士1999-12-07(火) 18:13
#11129-0RE#11127:Do..Loopステートメント中のイベントについてDora1999-12-07(火) 18:32
#11132-0RE#11114:Do..Loopステートメント中のイベントについて暗号君1999-12-07(火) 18:49
#11149-0RE#11114:Do..Loopステートメント中のイベントについてボーラード1999-12-07(火) 21:25
Dora1999-12-07(火) 17:03
Do..Loopステートメント中のイベントについて教えて下さい。 プログラムが複雑になってくると、イベントがちゃんと割り込まれなくなって、 正しく動作されなくなってしまうのですが、何かよい対処方法ありますでしょうか。 下の例はちょっと手抜きで極端ですけど、こんな感じです。 Private Sub Winsock1_SendComplete() Flg=1 End Sub Private Sub Winsock2_ConnectionRequest(ByVal requestID As Long) Do If Flg=1 Then Exit Do DoEvents Sleep 100 Loop Winsock2.Accept requestID End Sub Winsockコントロールを2つ使っていて、 Winsock1.SendDataでデータを送信し、送信が完了した時点で Winsock2をAcceptしたいのですが、Do..Loopでループにおちいってしまいます。 一度VBのデバッガで中断して再度開始するとイベントは発生します。 何かいい方法ご存じでしたら、ご教授ください。 よろしくおねがいします。
VB戦士1999-12-07(火) 18:13
> Do..Loopステートメント中のイベントについて教えて下さい。 > プログラムが複雑になってくると、イベントがちゃんと割り込まれなくなって、 > 正しく動作されなくなってしまうのですが、何かよい対処方法ありますでしょうか。 > > 下の例はちょっと手抜きで極端ですけど、こんな感じです。 > > Private Sub Winsock1_SendComplete() > > Flg=1 > > End Sub > > > Private Sub Winsock2_ConnectionRequest(ByVal requestID As Long) > > Do > If Flg=1 Then Exit Do > DoEvents > Sleep 100 > Loop > Winsock2.Accept requestID > > End Sub > > Winsockコントロールを2つ使っていて、 > Winsock1.SendDataでデータを送信し、送信が完了した時点で > Winsock2をAcceptしたいのですが、Do..Loopでループにおちいってしまいます。 > 一度VBのデバッガで中断して再度開始するとイベントは発生します。 > > 何かいい方法ご存じでしたら、ご教授ください。 > よろしくおねがいします。 仕様が解らないので何とも言えませんが Do〜Loopの中にDoEvents関数とSleep関数が 使われてるのですがSleep関数を使うのであればDoEventsは必要ないような気がします。 後、条件を満たしたら抜けるようなループであればDo WhileやDo Untilでループさせた方がいいのでは? While → 〜の間 Until → 〜まで
Dora1999-12-07(火) 18:32
> 仕様が解らないので何とも言えませんが Do〜Loopの中にDoEvents関数とSleep関数が > 使われてるのですがSleep関数を使うのであればDoEventsは必要ないような気がします。 > 後、条件を満たしたら抜けるようなループであればDo WhileやDo Untilでループさせた方がいいのでは? > > While → 〜の間 > Until → 〜まで Sleepを入れないと、CPUモニターでみるとCPUを100%占有してしまうんですね。 Sleepを使う時、DoEventsをいれないとハングったようになってしまうので この2行を入れてるんです。 Do WhileやDo Untilでも結果は同じでした。 なにか、ループをさせずに待つ方法があればいいのですが・・・。
暗号君1999-12-07(火) 18:49
こんばんは。 > Private Sub Winsock1_SendComplete() > > Flg=1 > > End Sub > > > Private Sub Winsock2_ConnectionRequest(ByVal requestID As Long) > > Do > If Flg=1 Then Exit Do > DoEvents > Sleep 100 > Loop > Winsock2.Accept requestID > > End Sub > > Winsockコントロールを2つ使っていて、 > Winsock1.SendDataでデータを送信し、送信が完了した時点で > Winsock2をAcceptしたいのですが、Do..Loopでループにおちいってしまいます。 > 一度VBのデバッガで中断して再度開始するとイベントは発生します。 これは、私も経験があります。 ただ、その時の VB のバージョンなどは、全く覚えていません(ごめんなさい)。 で、その時は、勝手に Winsock コントロールの不具合だと決め付けて、 全て Winsock API で書き直してしまいました。 結局、今になっても、コーディングが悪かったのか、コントロールの不具合だったのか、よくわかりません。 うう…。役に立たない情報でもうしわけありません。
ボーラード1999-12-07(火) 21:25
> Do..Loopステートメント中のイベントについて教えて下さい。 > プログラムが複雑になってくると、イベントがちゃんと割り込まれなくなって、 > 正しく動作されなくなってしまうのですが、何かよい対処方法ありますでしょうか。 > > 下の例はちょっと手抜きで極端ですけど、こんな感じです。 > > Private Sub Winsock1_SendComplete() > > Flg=1 > > End Sub > > > Private Sub Winsock2_ConnectionRequest(ByVal requestID As Long) > > Do > If Flg=1 Then Exit Do > DoEvents > Sleep 100 > Loop > Winsock2.Accept requestID > > End Sub 別談かもしれないけど... ループの中で Sleep関数は使用しない方がいいかも? Sleepを含むループを10分間回しつづけたら、アプリからの応答が無くなった経験があります。 Timer関数を使用し、自分で時間管理したら、20分でも回り続けてくれた。
このページと関連する記事:
#26581-0APIのSleep関数2000-07-26(水) 15:56#20981-0Shellで開いたIEを閉じる2002-05-29(水) 18:23
#27490-0Do Loopの使い方2002-03-12(火) 14:28
#6318-0WinSockでRETR コマンドを送信して GetData メゾットでメールを取得しているのですが21999-09-30(木) 16:33
#16342-0Do Loopの条件が実行されません2000-11-16(木) 22:05
#12798-0ReadFile関数をLoop内で使用する方法について2000-01-07(金) 23:12
#26017-0完了復帰制御2000-07-18(火) 20:23
#22425-0Do〜Loopを続行させる2001-08-15(水) 10:08
#2443-3Winsockについて教えてください2001-12-05(水) 05:03
#25245-0Do Loopを抜ける方法2001-12-11(火) 09:41