■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#199-2Sleepについててながワニ2001-10-18(木) 13:16
     #200-2RE#199:SleepについてよねKEN2001-10-18(木) 13:35
     #202-2RE#199:SleepについてDental2001-10-18(木) 14:08
     #200-0RE#199:SleepについてよねKEN2001-10-18(木) 22:35
     #202-0RE#199:SleepについてDental2001-10-18(木) 23:08
#199-2
Sleepについて
はじめてカキコさせていただきます。どうかよろしくお願い致します。
すごく初歩的なご質問かもしれませんが、API関数に関するものはQ&Aがルールとの記事を見ましたので
こちらの方にカキコさせていただきます。

API関数のSleep関数とWhileループを利用して複数のBMPを交互に表示させてアニメーションを
たくらんでいますが、そこでSleep関数を使用しています。

アニメーションはできるのですが、そのループの途中にKeyPressなどのイベントを処理したいのですが、
処理を記述しても全く動作してくれません。

どなたか、Sleep関数を利用したWhileループの途中にイベントを処理する方法を教えてください。

ちなみに、コードはこのような感じです。

---------- (Code) -----------

sub Maintimer()

while (条件式)

(画像の1枚目または2枚目を表示)

Sleep(100)

wend

end sub

-----------------------------

どなたか、よろしくお願い致します。
#200-2
RE#199:Sleepについて
> API関数のSleep関数とWhileループを利用して複数のBMPを交互に表示させてアニメーションを
> たくらんでいますが、そこでSleep関数を使用しています。
> 
> アニメーションはできるのですが、そのループの途中にKeyPressなどのイベントを処理したいのですが、
> 処理を記述しても全く動作してくれません。
Sleep関数を使った場合も使わない場合でもそうですが、
ループ処理中はそのままではイベントが拾えません。そのため固まったような状態になります。
これに対応するにはDoEvents関数があります。ヘルプをご覧ください。
 
> どなたか、Sleep関数を利用したWhileループの途中にイベントを処理する方法を教えてください。

また、Sleep関数で停止中は自分のアプリケーションは完全に停止してしまうので、
あまり長い時間を指定するとフリーズしているようにみえますので気をつけましょう。

> ちなみに、コードはこのような感じです。
> 
> ---------- (Code) -----------
> 
> sub Maintimer()

Dim i As Long

> while (条件式)
> 
> (画像の1枚目または2枚目を表示)
> 
> Sleep(100)
この1行の代わりに
For i = 1 To 10
    DoEvents
    Call Sleep(10)
Next
のようにするとよいでしょう。
> 
> wend
> 
> end sub
> 
> -----------------------------
#202-2
RE#199:Sleepについて
> while (条件式)
>  (画像の1枚目または2枚目を表示)
>  Sleep(100)
> wend

Sleepの後に、DoEventsを発行すればOKです。

ただし、Sleep中はVBの処理が「凍り付く」ので、
数秒以上のウェイトを必要とする場合は、

Do
  (画像表示処理)
  For L = 0 To 10
     Sleep 100
     DoEvents
  Next L
Loop Until (条件)

のように、頻繁にDoEventsを発行する必要があります。


あるいは、XP掲示板の#236のように、WaitableTimer APIを使うという手もあります。
これなら、一定時間が経過する前に、マウス操作・キーボード操作・画面の再描画要求等が
発生したとしても、それらを適宜割り込んで処理させることができるので、
KeyPress等のイベントが凍りつく事なく、処理させることができます。

XP掲示板#236のクラスを使ってコーディングすれば、こんな感じですかね。

Private Flag As Boolean

Private Sub Form_KeyPress(KeyAscii As Integer)
    Cls
    Print "&H" & Hex(KeyAscii) & "が押されました"
    If KeyAscii = vbKeyReturn Then
        Print "中断要求発行"
        Flag = True
    End If
End Sub

Private Sub MainTimer()
    Dim objTimer As XP掲示板236のクラス名

    Flag = False
    Set objTimer = New XP掲示板236のクラス名
    Do
        '<アニメーション処理>
        Picture1.Visible = Not Picture1.Visible
        Picture2.Visible = Not Picture2.Visible
        '</アニメーション処理>

        'Sleep 2000
        'DoEvents

        objTimer.Sleep 2000

    Loop Until (Flag = True)
    Print "アニメーションを中断しました"
    Set objTimer = Nothing
End Sub
#200-0
RE#199:Sleepについて
> API関数のSleep関数とWhileループを利用して複数のBMPを交互に表示させてアニメーションを
> たくらんでいますが、そこでSleep関数を使用しています。
> 
> アニメーションはできるのですが、そのループの途中にKeyPressなどのイベントを処理したいのですが、
> 処理を記述しても全く動作してくれません。
Sleep関数を使った場合も使わない場合でもそうですが、
ループ処理中はそのままではイベントが拾えません。そのため固まったような状態になります。
これに対応するにはDoEvents関数があります。ヘルプをご覧ください。
 
> どなたか、Sleep関数を利用したWhileループの途中にイベントを処理する方法を教えてください。

また、Sleep関数で停止中は自分のアプリケーションは完全に停止してしまうので、
あまり長い時間を指定するとフリーズしているようにみえますので気をつけましょう。

> ちなみに、コードはこのような感じです。
> 
> ---------- (Code) -----------
> 
> sub Maintimer()

Dim i As Long

> while (条件式)
> 
> (画像の1枚目または2枚目を表示)
> 
> Sleep(100)
この1行の代わりに
For i = 1 To 10
    DoEvents
    Call Sleep(10)
Next
のようにするとよいでしょう。
> 
> wend
> 
> end sub
> 
> -----------------------------
#202-0
RE#199:Sleepについて
> while (条件式)
>  (画像の1枚目または2枚目を表示)
>  Sleep(100)
> wend

Sleepの後に、DoEventsを発行すればOKです。

ただし、Sleep中はVBの処理が「凍り付く」ので、
数秒以上のウェイトを必要とする場合は、

Do
  (画像表示処理)
  For L = 0 To 10
     Sleep 100
     DoEvents
  Next L
Loop Until (条件)

のように、頻繁にDoEventsを発行する必要があります。


あるいは、XP掲示板の#236のように、WaitableTimer APIを使うという手もあります。
これなら、一定時間が経過する前に、マウス操作・キーボード操作・画面の再描画要求等が
発生したとしても、それらを適宜割り込んで処理させることができるので、
KeyPress等のイベントが凍りつく事なく、処理させることができます。

XP掲示板#236のクラスを使ってコーディングすれば、こんな感じですかね。

Private Flag As Boolean

Private Sub Form_KeyPress(KeyAscii As Integer)
    Cls
    Print "&H" & Hex(KeyAscii) & "が押されました"
    If KeyAscii = vbKeyReturn Then
        Print "中断要求発行"
        Flag = True
    End If
End Sub

Private Sub MainTimer()
    Dim objTimer As XP掲示板236のクラス名

    Flag = False
    Set objTimer = New XP掲示板236のクラス名
    Do
        '<アニメーション処理>
        Picture1.Visible = Not Picture1.Visible
        Picture2.Visible = Not Picture2.Visible
        '</アニメーション処理>

        'Sleep 2000
        'DoEvents

        objTimer.Sleep 2000

    Loop Until (Flag = True)
    Print "アニメーションを中断しました"
    Set objTimer = Nothing
End Sub
このページと関連する記事:
#199-0Sleepについて2001-10-18(木) 22:16
#16342-0Do Loopの条件が実行されません2000-11-16(木) 22:05
#11114-0Do..Loopステートメント中のイベントについて1999-12-07(火) 17:03
#30899-0処理の中断2000-10-01(日) 17:55
#22077-0waitってあるんでしょうか?2001-08-01(水) 14:24
#15074-0タイマーでウェイトをかける方法2001-03-15(木) 11:18
#2721-0画面がちらつきについて1999-10-10(日) 09:44
#2154-0timerイベントについて1999-09-26(日) 21:45
#5021-1画像のフェード1999-09-13(月) 00:30
#13465-0LoadPicture中のTimerイベントについて2000-12-15(金) 15:54
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)