DOBON.NET DOBON.NETプログラミング掲示板過去ログ

繰り返し処理でのエラー

環境/言語:[XP]
分類:[.NET]

初めまして。
ある条件がTrueになるまで、半永久的にSQLを実行するという処理なのですが、
処理実行中に、「応答なし」エラーとなってしまいます。

バックグランウンドでバッチ処理が行われており、VB.NET側からSQLのSELECT文で
指定したテーブルに、指定した条件のデータが存在するのかをチェックして
います。
バッチ処理が正常に終了すればblm_Sleepがtrueとなり、Loopが終了します。

呼び出し側のフォームを frm1
呼び出される側のフォームを frm2
とすると、g_sub_Load()はfrm2のsubです。
本来なら、frm1からfrm2のインスタンスを作成し、ShowDialogを
使用したいのですが、仕様上frm1から、ロードイベントと同じような
frm2のpublicのsubから呼び出しています。

上に記述したエラーが出ない良い方法があるでしょうか?
わかりにくい記述かもしれませんが、よろしくお願いします。

以下がソースです。

Public Sub g_sub_Load()

Dim blm_Sleep As Boolean '判定フラグ
Dim str_SQL As String   'SQL文
Dim str_Msg As String 'LOG管理情報TBメッセージ

With Me
.Show()

'強制的に画面表示
Application.DoEvents()

'初期化
blm_Sleep = False

'データ取得用SQL作成

'判定がTrueになるまで半永久的に繰り返し
Do

    SQL発行(処理がokなら、blm_Sleep=True)

If Not blm_Sleep = True Then
'3秒待つ
System.Threading.Thread.Sleep(3000)
End If

Loop While Not blm_Sleep = True

END_STEP:
.Hide()
End With
End Sub
■No2437に返信(たぁしさんの記事)
> 初めまして。
> ある条件がTrueになるまで、半永久的にSQLを実行するという処理なのですが、
> 処理実行中に、「応答なし」エラーとなってしまいます。
>
> バックグランウンドでバッチ処理が行われており、VB.NET側からSQLのSELECT文で
> 指定したテーブルに、指定した条件のデータが存在するのかをチェックして
> います。
> バッチ処理が正常に終了すればblm_Sleepがtrueとなり、Loopが終了します。
>
> 呼び出し側のフォームを frm1
> 呼び出される側のフォームを frm2
> とすると、g_sub_Load()はfrm2のsubです。
> 本来なら、frm1からfrm2のインスタンスを作成し、ShowDialogを
> 使用したいのですが、仕様上frm1から、ロードイベントと同じような
> frm2のpublicのsubから呼び出しています。
>
> 上に記述したエラーが出ない良い方法があるでしょうか?
> わかりにくい記述かもしれませんが、よろしくお願いします。
>
> 以下がソースです。
>
> Public Sub g_sub_Load()
>
> Dim blm_Sleep As Boolean '判定フラグ
> Dim str_SQL As String   'SQL文
> Dim str_Msg As String 'LOG管理情報TBメッセージ
>
> With Me
> .Show()
>
> '強制的に画面表示
> Application.DoEvents()
>
> '初期化
> blm_Sleep = False
>
> 'データ取得用SQL作成
>
> '判定がTrueになるまで半永久的に繰り返し
> Do
>
>     SQL発行(処理がokなら、blm_Sleep=True)
>
> If Not blm_Sleep = True Then
> '3秒待つ
> System.Threading.Thread.Sleep(3000)
> End If
>
> Loop While Not blm_Sleep = True
>
> END_STEP:
> .Hide()
> End With
> End Sub
>

Do-Loop内でDoEventsを行ったらどうでしょう?

○DoEventsを行う
http://dobon.net/vb/dotnet/vb6/doevents.html
こんにちは、たぁしさん,琴さん。ピラルクです。

> Do-Loop内でDoEventsを行ったらどうでしょう?

DoEventsは副作用も多いので、使わないで済むなら極力使わない
ほうがベターです。

たぁしさんのケースでは、Timerを使うのがピッタリでは?
琴さん,ピラルクさん返信ありがとうございます。
琴さん・・・DoEvents処理は一度だけでも問題はありませんでした。
ピラルクさん・・・SQL文の発行時にTimerイベントを使いましたが、結果は同じでした。恐らく回数を指定しないでLoop処理を行っていること自体に問題があるようです。しかし、コーディングは簡略されました。
良い方法がないでしょうか?
> ピラルクさん・・・SQL文の発行時にTimerイベントを使いましたが、結果は同じでした。
> 恐らく回数を指定しないでLoop処理を行っていること自体に問題があるようです。しかし、コーディングは簡略されました。

おそらくピラルクさんの意図されるところの
「Timer(コントロール)を使うのがピッタリでは?」と違うことをされていると思います。

Timerコントロールを使う場合、
Do〜Loopを使うのではなく、ループで処理している部分の処理を
TimerコントロールのTickイベントで定期実行させます。

Loadイベントではタイマーの開始の指示だけしてやればOKです。
Tickイベントでは、SQLの発行処理を行うと共に、
blm_Sleep = Trueになったらタイマーの停止をしてやりましょう。
よねKENさん・・・すみません。説明不足でした。frm1の処理からfrm2をshowする際に、showdialogでは上手くいかなかったためにsubでLoadと同じような処理をしていました。そうではなく、frm2を呼び出すのをshowdialogにし、frm2のloadイベントでtimerコントロールの設定をし、timerコントロールのTickイベントでSQLを発行してやればうまくいきました(Tickイベントの中で判定も行う。)
もっとシンプルにPGを考えればよかったんですね・・・。
説明下手で本当、申し訳なかったです。
こんな未熟者のためにありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板