■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
|
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(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
#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
てながワニ2001-10-18(木) 13:16
はじめてカキコさせていただきます。どうかよろしくお願い致します。 すごく初歩的なご質問かもしれませんが、API関数に関するものはQ&Aがルールとの記事を見ましたので こちらの方にカキコさせていただきます。 API関数のSleep関数とWhileループを利用して複数のBMPを交互に表示させてアニメーションを たくらんでいますが、そこでSleep関数を使用しています。 アニメーションはできるのですが、そのループの途中にKeyPressなどのイベントを処理したいのですが、 処理を記述しても全く動作してくれません。 どなたか、Sleep関数を利用したWhileループの途中にイベントを処理する方法を教えてください。 ちなみに、コードはこのような感じです。 ---------- (Code) ----------- sub Maintimer() while (条件式) (画像の1枚目または2枚目を表示) Sleep(100) wend end sub ----------------------------- どなたか、よろしくお願い致します。
よねKEN2001-10-18(木) 13:35
> 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 > > -----------------------------
Dental2001-10-18(木) 14:08
> 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
よねKEN2001-10-18(木) 22:35
> 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 > > -----------------------------
Dental2001-10-18(木) 23:08
> 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