電子書籍の厳選無料作品が豊富!

C++プログラムについて質問です。

Basicでしたら、バックグランドで処理を常に続けながら、
Formウィンドウで入力を受け付けたり、ウィンドウ表示を最新に更新させることが、
簡単にできたと思いますが、それが、C++ではできません。

例えば、以下のとき(内容は意味のないプログラムですが、)
***Form1.h 内、一部抜粋*********
for (int i = 0; i < 10000000; i++) {
double m = 123.4567;
double n = 234.5677;

double p = m * n;
double q = m / n;

if ( i % 100 == 0 ) lable1->Text = i.ToString;
}
******************************
100回に1回、Formウィンドウに計算の進行状況を表示させたいと思いますが、
途中では更新されず、計算が全て終了したときのみ更新されます。

このようなことをC++でやるには、手間がかかるのでしょうか。
C#とかなら簡単にできるのでしょうか。
分かりづらい点があるかもしれませんが、よろしくおねがいします。

A 回答 (5件)

ちと遅い気もしますが。



(1)
フォームへの入力もイベントとして扱われますから、イベント入力待ち状態に戻れば問題なく入力可能になります。

(2)
C#が簡単というよりも、C++/CLIがVB.NETやC#と比べて言語レベルでややこしいと言う方が正確なところです。
ただしC#でもスレッドは必要なので、スレッドを使うのが面倒というならDoEventsが使えるVB.NETの方がC#よりも楽でしょう。
    • good
    • 0
この回答へのお礼

D-Matsuさん、ご回答ありがとうございます。

メッセージキュー、メッセージループの仕組みから、
入出力のウィンドウがフリーズすることが理解できました。

VBには、DoEventsという便利なのもがあり、C++にはないことも分かりました。

http://dobon.net/vb/dotnet/vb6/doevents.html
ここを見ると、C#もDoEventsできるようですね。

お礼日時:2011/05/24 00:23

C++Builderであれば


Application->ProcessMessages()
でメッセージキューにあるメッセージを処理することで、表示を更新できます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。No.1への返信でまとめて返事しています。

お礼日時:2011/05/19 22:13

おそらくフォームのボタンを押した際などの処理と思われますが、イベント処理中は他のイベントを基本的にブロックする、つまり画面更新もされないのでそーゆー事になります。


該当の処理をイベントに依らないスレッドで処理するか、明示的に「イベントを処理する」という事を行う必要があります。
http://dobon.net/vb/dotnet/vb6/doevents.html
    • good
    • 0
この回答へのお礼

回答ありがとうございます。No.1への返信でまとめて返事しています。

お礼日時:2011/05/19 22:14

C++/CLIでプログレスバーを出すということなら、検索すれば


http://d.hatena.ne.jp/ekiryu/20090724/p1
などの例がありますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。No.1への返信でまとめて返事しています。

お礼日時:2011/05/19 22:14

> Basicでしたら、バックグランドで処理を常に続けながら、


> Formウィンドウで入力を受け付けたり、ウィンドウ表示を最新に更新させることが、
> 簡単にできたと思いますが、それが、C++ではできません。

できますよ。スレッド起こすとか(C++/CLIなら)BackgroundWorker立てるとか。
    • good
    • 0
この回答へのお礼

epistemeさん、nora1962さん、D-Matsuさん、___gooさん
回答ありがとうございます。

すみません、基本的な情報が抜けていました。
「Visual C++ 2008 express edition」を使用しています。

D-Matsuさんのおっしゃるとおり、「フォームのボタンを押したときの処理」です。
「スレッド」でやるべきということはなんとなく分かりました。

そこで、
(1)スレッドを使えば、処理中に、表示更新だけでなく、
 フォーム空欄への入力も受け付けられるのでしょうか。
(2)Visual C#を使えば、スレッドなど使わずに、簡単に実現できるのでしょうか。
 入出力があるプログラムはVC++よりVC#がおすすめということはありますか?

スレッドに取り組みたいですが、その前に上記の点を確認したいと思っております。

お礼日時:2011/05/19 22:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!