• 締切済み

実行した後、どうしてもフリーズしてしまう。。。

はじめまして BCB6proを使用していて開発歴1ヶ月のど素人です。 現在USBデバイスの制御を行っていまして、問題は実行して 何秒か立つとフリーズしてしまうというものです。 その何秒かというのはほとんどランダムです。10回に1回ぐらいは問題なく走ってくれます。 OnTimerで勝手にinterval==10ごとにUSBデバイスにデータを書き込み、さらにTCP/IPで送信もするというプログラムです。 そもそもBuilderでの無限ループの作り方がわかってないような気がします。OnTimerを使う以外にいい方法があるのでしょうか? VC++のようにwhile等を入れたら、それまたフリーズしてしまいました。質問がわかりづらくてごめんなさい。 ご教示願います。

みんなの回答

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.4

ちょっと気になったんですが、 > Intervalを200ぐらいにしたら問題なく動くのですが USBドライバのタイムアウトと競合してませんか? USBデバイスアクセスの部分をDummyのスタブに変えてテストしてみてください。 Ontimerのintervalは10で。 USBドライバのタイムアウト処理と競合しているならUSBドライバを別の物に変えるか、改造するか、Ontimerを辞めるしかないでしょう。

回答No.3

こんにちは。  USBデバイスへの書き込みは行われています?それが止まっていませんか?もしくは、TCP/IPのところで。  一度USBデバイスへの書き込み、TCP/IPの通信を何も行わない、空の関数に変え、正しく割り込みが行われているか確認してみてください。(デバッグの基本です)  それから、リソースの解放はちゃんとやっていますか?openだけしてcloseしていないとか、取得して解放していないとか、通信関係で『デッドロック』が発生している可能性も否定できないのではないでしょうか。  BCBが素人でも、VCでそれなりに経験があるなら、根本の部分は同じです。経験は生かしてください。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

whileであろうが、forであろうが、たとえgotoであっても「計画され無限ループ」はフリーズではありません。 > BCB6pro ということは、Microsoft Windows2000Pro以上のOSですね。OSは何ですか? VCLアプリですか?MFCアプリですか?コンソールアプリですか? コンポーネントは何を使っていますか? > OnTimerで勝手にinterval==10ごとにUSBデバイスにデータを書き込み、 > さらにTCP/IPで送信もするというプログラムです。 タイマー割り込みはちゃんと起こってますか? OnTimerを呼び出した方の(割り込み処理でない方)プログラムは何をしているのですか? TCP/IPの制御は何を使っていますか?どんな手順ですか? USBデバイスのアクセスは何を使っていますか?どんな手順ですか? 割り込み処理でない方が、イベントループに制御を戻してやらなければ画面はフリーズするでしょう。 デバッガで追いかけてみましたか? マルチスレッドに出来ませんか?

daniel
質問者

補足

回答ありがとうございます.OSはWindowsXproです. BCBを使っている限りVCLアプリになるものかと思っているのですがこれは間違いなのでしょうか?使っているコンポーネントはボタンコンポーネント,メモコンポーネント,タイマー,通信コンポーネントです.このTCP/IP制御を行っている通信コンポーネントですが,VectorでダウンロードしたTMan2TManというソフトでDirectPlayをラッピングしたものだそうです.正直仕組みはわかっていません....  普段は何も処理していなくて,あるボタンを押すとOnTimerがTrueになってUSBデバイスとのデータの送受信を繰り返すという単純なプログラムです.USBドライバーは汎用(http://www.otto.to/~kasiwano/ )のものをダウンロードして使っています.OnTimerを呼び出しているほうは問題ないと思います.Intervalを200ぐらいにしたら問題なく動くのですが...  マルチスレッドという言葉は聞いたことがあるのですがBCBでやる方法をよくわかっていませんので少し勉強して今から試してみます.  

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

whileでbreakできなければCPU負担率MAXでLOOPしてしまいます。(フリーズ状態) 強制終了するか、ウインドウズメッセージをどうにかして 割り込ませないと止まりません。 BCBは使ったことありませんが、 OnTimerを使うのは正しいと思います。 おそらくフリーズするのはどっかで whileやfor文の無限ループに陥っているのでは ないかと思います。 (ところで10ms毎に動作させたいとして それを無限ループとは普通言わないのでは? 一般的に無限ループは脱出不可能なバグをさすと思います。) >VC++のようにwhile等を入れたら VC++でもwhile文は普通使いません。(マルチスレッドならokですが) SetTimer,MFCならOnTimer等を使います。 # あとOSのバージョンも書いたほうが良いかと。

関連するQ&A