[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/01/08(Mon) 18:12
投稿者名:ガルボ
Eメール:
URL :
タイトル:
タイマーイベント中に処理が止まる
フォームAとフォームBを表示して、フォームBのタイマーイベント内で数秒かかる処理をします。
フォームBのタイマーイベント処理中にフォームAのメニューバーをプルダウンすると、
フォームBのタイマーイベントが止まってしまいます。止まっている箇所はDoEventsの行でした。

また、フォームBのタイマーイベント処理中に、フォームAからフォームCをモードレスで
呼び出しても同じ現象がになります。

これの回避方法は無いのでしょうか?

以下のURLを読んでみたのですが、回避方法は「メニューバーを押さない」でした。
http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?mode=allread&no=8312#8312

投稿時間:2007/01/08(Mon) 23:14
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: タイマーイベント中に処理が止まる
> フォームBのタイマーイベントが止まってしまいます。止まっている箇所はDoEventsの行でした。

DoEvents がどのような働きをするかはご存知ですよね。
割り込みを許可しておいて、割り込ませたくないと言っても...。

> 以下のURLを読んでみたのですが、回避方法は「メニューバーを押さない」でした。
> http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?mode=allread&no=8312#8312
貴方の場合と上記では状況が違いますよね。
メニュー のEnabled = False にしてもその部分をクリックするとと言う条件では

他にもあったような
SetMenuItemInfoについて - ジム 01/26-16:36 No.1768

投稿時間:2007/01/08(Mon) 23:40
投稿者名:ガルボ
Eメール:
URL :
タイトル:
Re^2: タイマーイベント中に処理が止まる
> 割り込みを許可しておいて、割り込ませたくないと言っても...。
確かにそうですね。

ようするに、メニューのプルダウンや、フォームのモードレス表示で
タイマーイベント内の処理を止めないようにするためには
DoEventsを無くすしか方法は無いわけでしょうか?

投稿時間:2007/01/09(Tue) 09:58
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: タイマーイベント中に処理が止まる
> ようするに、メニューのプルダウンや、フォームのモードレス表示で
> タイマーイベント内の処理を止めないようにするためには
> DoEventsを無くすしか方法は無いわけでしょうか?

そもそも、タイマーイベントを止めないようにしたいのか?
同時に並行処理をしたいのかどちらなのでしょうか?
(過去の掲示板での話は、前記での場合での前提の話かと思うので)

VB6.0 では、マルチスレッド(詳しくは検索して調べて下さい)は無理なようなので...。
本格的な並行処理をしたいなら、VB.NET 系に移行して下さい。

投稿時間:2007/01/09(Tue) 10:24
投稿者名:ガルボ
Eメール:
URL :
タイトル:
Re^4: タイマーイベント中に処理が止まる
> そもそも、タイマーイベントを止めないようにしたいのか?
> 同時に並行処理をしたいのかどちらなのでしょうか?
> (過去の掲示板での話は、前記での場合での前提の話かと思うので)
>
> VB6.0 では、マルチスレッド(詳しくは検索して調べて下さい)は無理なようなので...。
> 本格的な並行処理をしたいなら、VB.NET 系に移行して下さい。

起動から終了までタイマーイベントを発生させ続けたいので、並行処理が望ましいです。
VB6.0での並行処理を諦めて実行ファイルを2個にして対応したいと思います。
ありがとうございました。

投稿時間:2007/01/09(Tue) 13:43
投稿者名:GOD
Eメール:
URL :
タイトル:
Re^5: タイマーイベント中に処理が止まる
> > そもそも、タイマーイベントを止めないようにしたいのか?
> > 同時に並行処理をしたいのかどちらなのでしょうか?
> > (過去の掲示板での話は、前記での場合での前提の話かと思うので)
> >
> > VB6.0 では、マルチスレッド(詳しくは検索して調べて下さい)は無理なようなので...。
> > 本格的な並行処理をしたいなら、VB.NET 系に移行して下さい。
>
> 起動から終了までタイマーイベントを発生させ続けたいので、並行処理が望ましいです。
> VB6.0での並行処理を諦めて実行ファイルを2個にして対応したいと思います。
> ありがとうございました。
>
解決しているけど他の方法としてフラグで処理分割してもよさそう。
(DoEventsを使用せずにこまめにタイマー割込みを終了させる。)
DoEventsしたいところで必要情報を外部変数に格納して一度タイマーを抜ける。次回タイマー発生時に続きから処理する。
Intervalは適当に。

'FormB
Private flg As Long

Private Sub Form_Load()
    flg = 0
    Timer1.Interval = 1000
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    Select Case flg
    Case 0
        '処理 A
    Case 1
        '処理 B
    Case 2
        '処理 C
    End Select
    flg = (flg + 1) Mod 3
End Sub

'ループさせているのなら↓見たいになるかな。
Private Sub Timer2_Timer()
    Dim i As Long

'    For i = 0 To 10000000
'        '処理
'        If (i Mod 10000) = 0 Then
'            FormA.Label1 = i
'            DoEvents
'        End If
'    Next

    For i = flg To flg + 9999
        '処理
    Next
    flg = i
    FormA.Label1 = flg
    flg = flg Mod 10000000
End Sub

投稿時間:2007/01/09(Tue) 12:17
投稿者名:K.J.K.
Eメール:
URL :
タイトル:
Re: タイマーイベント中に処理が止まる
こういうことでしょうか?
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/StpWch20.lzh