C++builderでのwhile()の使い方

このQ&Aのポイント
  • C++ Builderにおけるwhile()を使用する方法について説明します。
  • Borland C++ Builderでプログラムを作成している際に、ボタンを押した際に無限ループのwhile()に入るようにしたい場合、どのように実装するかについて質問です。
  • 複数のボタンを作成して、それぞれに対応するwhile()を実行したいが、一部のボタンしか動かない問題について質問です。これをマルチスレッドで実現する方法を教えてください。
回答を見る
  • ベストアンサー

C++builderにおけるwhile()の使い方

はじめまして、当方プログラムの初心者ですのでわかりづらい質問をしていますかもしれませんがよろしくお願いします. (質問)Borland C++ Builderを使っています。現在困っている点は単純に説明します.プログラムではウィンドウ上のボタンを押したというイベントが起きるとwhile()の無限ループに入るようになっています.このままだと実行したときにフリーズしてしまうのでwhile内にApplication->ProcessMessageを入れてあります. void __fastcall TMain_Form::Button1Click(TObject *Sender) {  while(1){ Application->ProcessMessage .............. } } このようなwhile突入ボタンがひとつのときはいいのですが、複数のボタンを作って、それぞれに対応するwhileを実行したいのですが、どうしてもひとつだけ動いて他が止まってしまいます. どなたか無限ループをマルチスレッドで複数、回らせる方法を教えてください. また、なんでもかんでもProcessMessageをいれてやればWINMAINに処理が移って、マルチスレッドになると思って使っているのですが間違いでしょうか? よろしくお願いします.

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

  • ベストアンサー
noname#118114
noname#118114
回答No.2

タイマの中にさらにタイマカウントを設けるのが良いでしょう。 タイマのインターバルを1000(1秒)にしておき タイマイベントで+1していき タイマカウントが一定値に達すると必要な処理を行い、タイマカウントを0に戻すとすれば大丈夫です。 こうすれば1秒ごとのカウントを取得でき、尚且つインターバルを動的に変更できます。 構造的には #pragma resource "*.dfm" TMain *Main; int TimeCount1; //タイマカウント1 //--------------------------------------------------------------------------- __fastcall TMain::TMain(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- //作成時 void __fastcall TMain::FormCreate(TObject *Sender) { TimeCount1 = 0; } //--------------------------------------------------------------------------- ・ ・ ・ //タイマ void __fastcall TMain::Timer1Timer(TObject *Sender) { TimeCount1++; if(カウンタ値 > TimeCount1) return; TimeCount1 = 0; ・ ・ ・ } //--------------------------------------------------------------------------- と言った感じにすれば良いです。 カウンタ値には処理を開始するまでの秒数を設定してください。

daniel
質問者

お礼

ありがとうございます.これでうまくいきそうです.またいろいろ応用できそうです.

その他の回答 (1)

noname#118114
noname#118114
回答No.1

Application->ProcessMessageは割り込みを処理なんで同時に複数のイベントは動いてくれません。 複数の無限ループをやりたいならタイマーイベントを複数使った方がずっと安全です。 初期状態でEnabledをfalseにしておいて、ボタンを押したらtrueに変更すれば良いでだけです。

daniel
質問者

補足

お答えいただきありがとうございます. ProcessMessageでだめな理由がわかりました. タイマーイベントについてなんですが、タイマーがカウントしている秒数を取得することは可能なのでしょうか. また、インターバルを動的に変えてしまうと、一回一回、0からカウントしてしまうようです.なので頻繁にインターバルの値を変えてしまうプログラムを作ってしまうと、永遠とオンタイマーイベントが発生しないという状況に陥ってしまいます.何とかならないのでしょうか?

関連するQ&A

  • 「Borland C++ Builder 5」で作成したプログラムについて

    「Borland C++ Builder 5」で作成したプログラム(コンポーネント使用)を、Builderを起動せずフリーソフトのようにWindows上で実行させるにはどうすればよいのでしょうか。

  • Borland C++ Builderで簡単なC言語プログラムの作成・実行

    Borland C++ Builderで簡単なCのプログラムを作り実行させるにはどうしたらよいですか? DOS窓上でコンパイルするのではなく、Borland C++ Builderのメニューから行いたいのです。 一応、「ファイル→新規作成→その他→Cファイル」でCのファイルは作成できるのですが、このファイルを「プロジェクト→ユニットのコンパイル」でコンパイルすることができません。 Formオブジェクト(?)を作成しておくとコンパイルできます。 Formは特に必要ないので、FormなしでCのファイルだけをコンパイルしたいのです。 DOS窓でのコンパイル・実行はできます。 事情があってBorland C++ Builderを使わなくてはなりませんので、他のIDEはこの際全く解決になりません。 よろしくお願いします。

  • C++からC#へ

     Visual Studio C# .NETのASPWebアプリケーションを使って、Borland C++ Builder6 で作成されたプログラムをWebアプリケーションに作りなおす事になりました。  期日がせまっているため、できれば簡単にできる方法を早急にしりたいです。 簡単じゃなくてもいいので、やり方や参考になるサイト何でもいいので教えて下さい。

  • C++のvolatileについて

    C++のvolatileについて volatileはマルチスレッドやメモリマップドi/oに使われるようですが、volatileの概念や使い方がさっぱり分かりません。 Webサイトで調べてもあまり意味が分からないし、参考になるサイトがなかなか見つからないので、ここで質問しました。 volatileでマルチスレッドを使った例のコードを教えてください。 また、以下のコードでは、「while文の中でloopの値を変更していないので、これはシングルスレッドでは単なる無限ループになり、あまり意味のない処理になる。ところが、マルチスレッドの場合は別のスレッドからloopの値を変更される可能性があるため、意味のある処理になる」というものですが、これはどういうことでしょうか。 ------------------------- bool loop; void Hoge(){ loop=true; int n=0; while(loop){ ++n; } cout << n << endl; } ------------------------- 上記のコードは、そのままでは無限ループになる。マルチスレッドにしてloopの値を変更するにはどうしたら良いでしょうか。

  • BorlandC++Builder5.0でリンカエラー

    現在A/D変換ボードの制御をしようとしています。 ボードのインストールも行なったのですが、以下のエラーが出て困っています。 外部シンボル 'AdOpen' が未解決(C:\PROGRAM FILES\BORLAND\CBUILDER5\PROJECTS\MAG\MAIN.OBJ が参照)と出てしまいます。 mainはシンプルなのですが... void __fastcall TForm1::OpenDevClick(TObject*Sender) { device_handle = AdOpen("FBIAD1"); if(device_handle == INVALID_HANDLE_VALUE){ ShowMessage("Err : デバイスのオープンに失敗"); return; } } そもそもこのエラーはなぜ出るのですか?

  • Borland C Builder とOpenCVをリンクしたい。

    Borland C Builder とOpenCVをリンクしたい。 Borland C Builder V5でOpenCV V2.1.0を使おうとこの1週間試行錯誤していますが、やり方がわかりません。 http://opencv.jp/opencv2-x-tips/install-on-windowswindows32bit-64bit-visual-studio-opencv21 に書かれている通りにOpenCV-2.1.0-win32-vs2008.exeをDLしてCMAKEを実行させたのですが、Build内のbinやlibには何も生成されません。 OpenCV-2.0.0a-win32.exeも試しましたが同様です。 CMAKEはやはりマニュアル通りにソースはc:\OpenCV2.0 ビルドはc:\OpenCV2.0\Buildとし、Configure、ビルドフォルダー作成Yes、Borland Make Fileを選択してパスはdefault native computerにし、Configure、赤表示が出てConfiguring doneが出た後再度Configgure、Generateと操作していますが、結果のBuild内のbinやlibフォルダーには何も出力されませんし。 このCMAKEと言うのを使用するのは初めてで、使い方は分からないのでマニュアルどおり(と思っている方法)で行っています。 系列は違いますが、OpenGLの方はBorland C Builderとリンク出来、サンプルプログラムの実行も成功しております。 今回、OpenCVを使う必要があり、何方か私の操作ミスお分かりの方が居られましたら正しい方法をお教え下さい。 よろしくお願い致します。

  • BCBでフォームの印刷

    Borland C++ Builder 5(Pro)を使っています。 TForm上にTImageを乗せ、そこにPolyline等で図形を描いています。 それを印刷したいのですが、TImageにはPrintメソッドがないので、 TFormのPrintメソッドを呼び出していますが、印刷できません。 プリンタのジョブを監視していると、何も印刷せずに「印刷済」になっています。 印刷ボタン、印刷設定ボタンのOnClickは以下のようになっています。 間違い等ありましたらご指摘ください。 // 印刷ボタン void __fastcall TGraphForm::PrintButtonClick(TObject *Sender) {   if(PrintDialog->Execute()){     GraphForm->Print();   } } // 印刷設定ボタン void __fastcall TGraphForm::PrtSetupButtonClick(TObject *Sender) {   PrinterSetupDialog->Execute(); }

  • VB.net 割り込みの禁止

    Borland C-Builder++の内容をVB.net 2010に書き換えて居る者です。 TextBox等の割り込みを一時的に禁止したいのですが、良い方法はありませんでしょうか。 無ければフラグを用いて、フラグが立っている時のみ処理をバイパスさせる事を考えて居ます。 Builder では ComboBox1->OnChange = NULL ; とコーディングする事により、 void __fastcall TForm1::ComboBox1Change(TObject *Sender) { Edit1->Text = ComboBox1->Text; } への割り込みを禁止出来、 ComboBox->OnChange = ComboBox1Change; とコーディングする事により割り込みを再開出来ました。 これを void __fastcall TForm1::ComboBoxChange(TObject *Sender) {     ComboBox1->OnChange = NULL ; Edit1->Text = ComboBox1->Text;     ComboBox->OnChange = ComboBox1Change; } とコーディングする事により、2重割り込みを防止していました。 VBでこの様にイベント割り込みを一時的に禁止にする方法はありますでしょうか。 宜しくご回答下さい。

  • windowsフォームアプリケーションについて

    windowsフォームアプリケーションについて 現在VC++のwindowsフォームアプリケーションを使ってマウスのみで作業ができる環境を作ろうとしてます。 その際に他のプログラムで作成した実行ファイルを外部アプリケーションとして system("C:\\~~\\--.exe") で表示させることに成功しました。 しかしこの実行ファイル(VC++で作成)はwhileループを用いているため途中で終了させることはできない仕組みになっています。 そこでこのwhileループを用いた実行ファイルをwindowsフォームアプリケーションのボタンクリックしたら終了するようなプログラムを作成したいのですがネットなどで調べてもコマンドが分からずに困っています。 アドバイスいただける方よろしくお願いします。

  • Application->Run();の機能について

    Borland C++でApplication->Run();は どういう機能を持っているのですか? WinMain関数内で実行されますが、関数を実行した プログラムは、どこから始まるのですか? 後は、フォームからのイベント待ちになるのでしょうか?