• ベストアンサー

VB6プログラムの実行中でのこと

VB6で作成したプログラムを実行していると、突然フリーズしたように 約10秒程止まる場合があります。一度、この現象が現れるとそれ以降は普通に 動作します。 実行するたびにこのようになります。 考えられる原因や対応方法などありましたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

今読み直して気が付いたのですが、、、 >止まる時は決まっていないのですが、Tabキーでの移動やコマンドボタンを >クリックした時が多いような気がします。 もしかしてですが・・・・ SetFocusやGotFocus/LostFocusのイベント類を使用していませんか? もし、コントロールAがフォーカスを受けた時、処理によってはコントロールBにフォーカスを移動させるなど・・・ フォーカス永久ループっていうことも考えられます。 以前に書いたように、1度目と2度目の実行は、メモリにロードされていない/されているという違いがあります。 よって、1つの処理についてのPCへの不可が比べ物にならないくらいかかります。 先に挙げたGotFocus/LostFocusイベントは、OSの状況によって左右されることもあります。 フォーカス永久ループの調査方法として、各GotFocusイベントにDebug.Print ActiveControl.Nameなどと記してみてください。 それと、、、思い出したのでついでに書いておきます。 Command1.FontBold = True とかしてませんか? 以前に経験したのですが、VB4ならこれでよいのですが、VB6のときたまにフォーカス永久ループになった経験があります。 Command1.Font.Bold = True とすることで回避できました。 FontBoldとFont.Boldの違いが、HP上では違いがわかりづらいですね。 一度、このページをテキストか何かにコピペして読んだらわかりやすいかも?

yukotoaiko
質問者

お礼

前回に頂いた回答と合わせてお礼を申し上げます。おかげさまで私自身、たくさんの勉強になりました。本当にありがとうございます。 前回の回答でご指摘のあった点で、その通りの指摘事項がありました。 ・DBを使っています。 ・たくさんのコントロールを使っています。 ・EXEの容量も大きいような気がします。約750KB位です。初心者の本を参考に、初めて作ったプログラムなので分割の方法があるということはわかりませんでした。やり方もわかりません。 そして、今回の回答にも私はびっくりしています。まさにその通りです。初心者のはずかしいプログラムを見られているようです。 SetFocusもCommand1.FontBoldも使っています。 回答して頂いた内容をそのまま使用してみることにします。 助かっただけでなく、勉強にもなり、ご親切にありがとうございました。

その他の回答 (4)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.4

サスペンドしてるHDDの復帰だったりして・・・。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

前回の発言は、1度目と2度目の実行時の差を説明しました。 >VB6で作成したプログラムを実行していると、突然フリーズしたように VBだからそうなるとは考えにくいですよね ^^; VBで作ったソフトだからそうなるとは、聞いたことがありません。 そちらの状況が良くわからないため、その1度目になぜそのような状況になるのかわかりません。 考え付くのは「環境」「プログラムの作り」ぐらいです。 以下に想像されることを書いておきます。 ※1.ソフトを起動しているPC環境 一.メモリが少なくないですか? 二.CPUが古いタイプではないですか?? 三.OSがインストールされているドライブの空き容量が少なくなってませんか? 四.常駐ソフトが多数起動中ではないですか? ※2.もし環境に問題がなければ、プログラムの作りに問題があると思われます。 一.DBを使用していますか? 二.画像/アイコンなどをたくさん使用していませんか? 三.コントロール類を多様していませんか? 四.FileSystemObjectを使用してませんか?(ルートを参照するとたまに重くなります) 五.PCが起動してすぐに立ち上げてませんか?(HDDにがビジー状態でないときに起動したほうがよいですよね) 六.コンパイル後のEXEの容量はいくつですか?(大きいEXEなら、機能分割をした別EXEにする方法もあります) 七.OLEオブジェクトを使用したフォームをロードしてませんか?(外部アプリの埋め込みは、結構処理が重いです) 八.市販のDBGridのようなもの(名前を書きたいけれど、批判されそうなので、名前は伏せます)を使用していませんか? 一番の解決方法は、ソースをここで公開することかも?

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

いろいろなことが考えられます。 起動時の処理が重ければ重いほど、2回目以降と差が生じます。 OSのメモリに一度ロードされたものは、メモリに残っている時はプログラムを毎回見に行かず、メモリを参照します。 なので、2回目以降は早くなることも考えられます。 あるいはDBに接続を行っている場合もそうです。これはスペックが低いPCほど、初回と2回目以降に差が生じます。 WinNTやWin2000を使用したことがあるのであればわかると思いますが、最初のログイン時と、ログオフして再ログインするのとでは、起動速度が違います。常駐ソフトの立ち上がりが違うからです。 一番の回避方法は、無駄にメモリを消費するようなプログラムを作成しないように努めることです。そうしたら、他のプログラムを邪魔をしないし、OSがメモリを参照しないでプログラムを見ていても、実行速度の差が少なくなります。 でもやはり、どんなプログラムを見ても、メモリ参照に勝るものはないですね。

yukotoaiko
質問者

お礼

実行した途端に現象がでることもあります。 止まる個所はまったく決まっていないのですが。 メモリの問題なのでしょうか。 メモリの問題があるということを初めて知りました。 回答してくださってありがとうございました。

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.1

長いループ処理などがあると他のアプリケーションに処理が移らなくなります。 そんなときは DoEvents関数をつかいます。

yukotoaiko
質問者

補足

止まる時は決まっていないのですが、Tabキーでの移動やコマンドボタンを クリックした時が多いような気がします。 プログラムでの処理で止まっている感じではないようです。 説明が足りなくてすみませんでした。