■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(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
#11114-0
Do..Loopステートメント中のイベントについて
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のデバッガで中断して再度開始するとイベントは発生します。

何かいい方法ご存じでしたら、ご教授ください。
よろしくおねがいします。
#11127-0
RE#11114:Do..Loopステートメント中のイベントについて
> 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 → 〜まで
#11129-0
RE#11127:Do..Loopステートメント中のイベントについて
> 仕様が解らないので何とも言えませんが Do〜Loopの中にDoEvents関数とSleep関数が
> 使われてるのですがSleep関数を使うのであればDoEventsは必要ないような気がします。
> 後、条件を満たしたら抜けるようなループであればDo WhileやDo Untilでループさせた方がいいのでは?
> 
> While → 〜の間
> Until → 〜まで
Sleepを入れないと、CPUモニターでみるとCPUを100%占有してしまうんですね。
Sleepを使う時、DoEventsをいれないとハングったようになってしまうので
この2行を入れてるんです。

Do WhileやDo Untilでも結果は同じでした。

なにか、ループをさせずに待つ方法があればいいのですが・・・。
#11132-0
RE#11114: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 のバージョンなどは、全く覚えていません(ごめんなさい)。
で、その時は、勝手に Winsock コントロールの不具合だと決め付けて、
全て Winsock API で書き直してしまいました。
結局、今になっても、コーディングが悪かったのか、コントロールの不具合だったのか、よくわかりません。

うう…。役に立たない情報でもうしわけありません。
#11149-0
RE#11114:Do..Loopステートメント中のイベントについて
> 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
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)