OSでの動作スピードの違い

このQ&Aのポイント
  • VC++6.0、Win2000環境で作成したプログラムが、Win98環境で遅くなる理由について知りたいです。
  • Win98のOSでは、VC++6.0で作成したアプリの動きが遅くなる現象が発生しているようです。
  • Win2000環境では問題なく動作しているアプリが、Win98環境では動きが遅くなるという現象が発生しています。なぜこのような違いが生じるのか疑問です。
回答を見る
  • ベストアンサー

OSでの動作スピードの違い

こんにちは。 現在VC++6.0、Win2000環境でプログラムしています。 MFCでダイアログベースで、クライアント領域だけのダイアログウィンドウを作って、 勝手に移動したりするアプリを作っています。 Win2000環境ではバリバリと動くのですが、 OSをWin98にしてEXEファイルを起動すると めちゃくちゃ遅くなります。(CPUは同じ) 不思議なことに、別のウィンドウをアクティブにして、 そのクライアント領域で マウスカーソルをぐりぐり移動させると、動きが速くなるんです。 一応動いているところを見ると、Win98で使えないAPIを 使っているふうでもなさそうです。 どのような機能を使うと、こういった処理速度の違いが誘発されやすくなるのでしょうか? もしご経験の方や、推測が出来る方がいらっしゃいましたら、 どうか宜しくお願いします。

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

  • ベストアンサー
  • honiyon
  • ベストアンサー率37% (331/872)
回答No.3

こんにちは、honiyonです。  うーん、その仕様ですとシンプルでOS差が出るような点が予想出来ません.(^^;  以下の事を試してみてください。    ・WM_TIMER時のBMP表示やダイアログ処理を全部コメントアウトする。    ・代わりに、MessageBeep(MB_OK); のみを実行するようにする。  これでプログラムを実行してみると、WM_TIMERが発生する毎に何らかの音が出ると思います。OSのサウンド設定が標準のままなら「ポーン」となると思います。  この間隔が Win98上において、マウスをのせた場合と乗せなかった場合で処理差が出る場合は、WM_TIMERの発生が何らかの理由により安定していない事になります。 処理差がでなかった場合は、BMP表示やダイアログ処理で差が出ている事になります。  前者の場合は、申し訳ないですが、はお手上げです(^^; ソースコード全部見て少しずつ検証していくことになります。後者の場合は、BMP表示やダイアログ処理をもう一度見直してみて、分からなかったらそのコードを載せて質問してみましょう。  ところで、Win98は WindowsUpdateで最新の状態に保たれていますか?「まさか」とは思いますが、WindowsUpdateでバグ修正したら直ったりする・・・カモ   参考になれば幸いです(..

amoban
質問者

お礼

amobanです。 honiyonさん、何度もありがとうございます。 本当に感謝感謝です。 えっと、MessageBeep関数を試してみました。 SetTimer( timeID, 50, NULL);←タイマー設定はこんな感じ 50/1000秒でWM_TIMER発生のはずですが、 Win98で実行すると、約1秒ごとにビープ音が出てます(泣)。 (WIN2000ではうまくいってます) しかしながら、ウィンドウの上にマウスカーソルを載せてみても、 それほどの音の変化はありませんでした。 (気のせいくらいにあるような気がします) ひとまずこれでプログラムの方を見てみようと思いますが・・・ 喜んでいいのやら悲しいやら(泣)。 もう少し調べたらまたご報告します。m(__)m

amoban
質問者

補足

honiyonさん、おまたせです。^^; amobanです。 ええっとですね、一応見当がつきました。 SetTimer関数で設定したタイマーのタイミングが早すぎるとダメみたいです。 今まで17/1000秒毎でタイマーを設定していましたが、 その設定だと今回のような出来事になりました。 その設定を35/1000秒毎にしてみると、アクティブなウィンドウにマウスカーソルを 合わせる、合わせないにかかわらず、同じタイミングで動いています。 タイマー処理内でフラグを立て、終わるときにフラグを消すということをして、 割り込む処理の重複をさせるようにしていましたが、 それではうまくいかなかったのに・・・・ というやはり不思議な現象です。 処理の重さによって、タイマーのタイミングを変えないといけないのかどうかは、まだ不明です。 まあ、一つ勉強になりましたが、やっぱりWindowsのプログラムは嫌いになりそうです(泣)。 honiyonさんには今回は助けていただいて、 本当にお礼の言いようもありません。 本当にありがとうございました。

その他の回答 (2)

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.2

こんにちは、honiyonです。   もう結構前の事で、具体的にどんなものだったかは覚えていないのですが、確か、     ・DirectXを使ったプログラムで、スクロールが非常に重い     ・複数のウインドウやオブジェクトを動かすジョークアプリケーションで、ウインドウの移動が非常に遅い   のどちらかだった気がします。   確か私は、DoEventsを処理ループ内には必ず入れ、ループを整理、簡潔化し、オブジェクトの生成も効率化・・・などとしているうちに解消しました汗   DoEventsはお試しになってみましたでしょうか?   VC++では、以下の関数を作ることで実現出来ます。 void DoEvents(void){  MSG msg;  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0){  TranslateMessage(&msg);   DispatchMessage(&msg);  } }   とりあえず、処理をあちこちコメントアウトしたり元に戻したりして、「どの処理のせいで減少が発生しているのか?」をつきとめてみてはいかがでしょうか?   色々試してみる前に、それから問題の解決を始めるのが効率が良いと思います。(この一件では人の事言えない解決の仕方してますが、私^^;)     参考になれば幸いです(..

amoban
質問者

お礼

こんにちは、honiyonさん。 amobanです。 早速のお答え、痛み入ります。 DoEvents はまだ試してないです~。 その前に色々コメントアウトする・・・などはしてたんですが、 結局場所の特定が出来ないというか、分からないままで・・・(泣) ひとまず簡単に今のアプリ(デスクトップアクセサリ)の流れをご説明しますと、 1.見えないダイアログウィンドウを本体として作成   (ここからタスクトレイにアイコンを登録) 2.本体から別のダイアログを生成(実際にBMPファイルを表示するダイアログ。クライアント領域のみ) 3.本体でSetTimer関数でタイマーをセットし、WM_TIMERイベント発生時にOnTimer関数から別ダイアログの表示&移動関数を実行 という流れです。 Windowsプログラムは今回が初めてで右往左往しながらここまでやってきたのですが、 もうこの先はちんぷんかんぷんって感じです(泣)。 DoEvents関数を入れるとしたら、どこがよろしいでしょうか? たびたびのお願い、申し訳ありませんが、宜しくお願いします。

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。   私も同様の経験がした事があります。   ・・・が、結局明確な原因は分かりませんでした。   ちょっとアルゴリズムを変えてあげたらちゃんと動くようになりました。ナゾな事件でした(^^;   そもそもマルチタスクを実現している処理がWin95系とWinNT系では全く違うものでしょうし、それに伴い API関数の実現方法も全く違うものになっている事でしょう。   その差異が現れている、もしくはWin95系の不具合と考えるのが良いかも知れません。   ここからは推測になってしまうのですが、きっとウインドウに割り当てられる処理時間が少ないのだと思います。その為、1秒あたりの処理出来る時間が短くなり、結果として遅くなってしまう。 そこにマウスカーソルを乗せる事で、マウスのイベントが発生する。 すると、どういうわけか一時的に割り当てられる処理時間が増え、処理が速くなる。   じゃあどうすれば良いのか?といえば、私にはよくわかりません(^^;   Windowsに気に入られるアプリケーションにしなければ・・・としか笑 とりあえず、VBでいうところの DoEvents のようなメッセージキューを処理するような関数を作成しひんぱんに呼び出してみてはいかがでしょうか? うーん、これで解決するか全く自信ないのですが・・・。   参考になれば幸いです(..

amoban
質問者

お礼

honiyonさん、こんにちは。 お答えありがとうございます。 Windowsに気に入られるプログラム・・・ どうすればいいんでしょうね(^^; ちなみにタイマー割り込みの時間を短くしてみたりしましたが、 まったく同じようなスピードで動くんです(泣)。 何かの処理を待ってるのかな?って感じです。 ともかく、アルゴリズムの変更でうまくいくことがあるのでしたら、 そういったクセを見抜くしかなさそうですね。 ちなみに、アプリではウィンドウを移動する関数とかを頻繁に使っています。 もし差し支えなければ、honiyonさんの作ったアプリは どのようにアルゴリズムの変更を行ったのか、 どういった類のアプリをおつくりになったのか教えていただけないでしょうか? 厚かましいお願いですが、よければ宜しくお願いします。

関連するQ&A

  • Winsockでクライアントのポート番号を設定したいです

    環境はWin2000,VC++6.0,MFC,ダイアログベースです Winsockではサーバ側のポート番号を指定しますよね。 クライアント側のポート番号を設定したいのですができますでしょうか? acceptされるポート番号を一定にしなくてはならない状況なのでよろしくお願いします。

  • ダイアログベースのウィンドウメッセージについて

    Win2kのVC++6.0 MFC ダイアログベースでのウィンドウメッセージ処理で困っています。 OnCharがダイアログでは認識できません。ウィンドウでは認識できます。 何か特別な処理が必要なのでしょうか?

  • BOOLの初期値は?

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> BOOL bl; と宣言した後、必ず bl = FALSE; と初期値を入れているのですが、元々FALSEかTRUEのどちらか、 決まった初期値が入っているのでしょうか?

  • SDIのクライアント領域に子ウィンドウを生成するには?

    環境 Win98 VC++6.0 MFCにて http://www.kumei.ne.jp/c_lang/sdk/sdk_50.htm ↑のように、SDIにてクライアント領域に子ウィンドウを生成するには、MFCの場合どうすれば良いのでしょうか? いつも質問ばかりで申し訳ありません。 ご存知の方お願いいたします。

  • ウィンドウの再描画

    よろしくお願い致します。 環境 WIN98 VC++6.0 MFC にて ウィンドウをクリックしてダイアログを表示。 ダイアログのボタン押し下げでウィンドウを再描画させたいのですがどうすれば良いですか?

  • スレッドの作成と起動

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> ボタンを押すとOnButton()に入ります。 OnButton()内でワーカースレッドを起動させたいのですが、 どのようにコーディングするのでしょうか? スレッドの作成方法も分かりません・・。 宜しければご指摘お願い致します。

  • wsprintfで浮動小数を扱うには?

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> wsprintf(a,"%f",b); MessageBox(a); で実行すると"f"が出力されました。 浮動小数を出力するにはどうしたら良いのでしょうか? よろしくお願いします。

  • ウィンドウのフレームの色変更

    <環境> Win98 VC++6.0 MFC よろしくお願いします。 ダイアログのボタン押し下げにて、新規にウィンドウを作成しています。 新規に作成したウィンドウのクライアント領域の色は、 CPaintDC dc(this); // 描画用のデバイス コンテキスト CRect cr; GetClientRect( &cr); dc.FillSolidRect( cr, RGB( 250, 250, 0)); dc.DrawText( moji,cr, DT_SINGLELINE | DT_VCENTER | DT_CENTER); にて変更することが出来ました。 クライアント領域の外側にあるフレームの色も変更したいのですが、 どのようにすれば実現可能でしょうか? ご存知の方、教えてください。お願いします。

  • テキストボックスをアクティブにするには?

    環境 WIN98 VC++6.0 MFC SDIにて よろしくお願いいたします。 ダイアログにテキストボックスが貼りつけており、ダイアログが表示されるときには、文字が表示されるようにしています。 この時、ダイアログをアクティブにし、 1.文字全体のバックを青色にアクティブにする 2.あるいは、文字の最後にカーソルを持っていく この2つの方法が知りたいのですが、ご存知の方お教えください。

  • ウィンドウ生成時の不具合について

    VC++6.0 WIN98 MFCにて ウィザードを使ってSDIにてウィンドウ1を作成し、メニューをクリックすることで、ウィンドウ2が新たに生成されるプログラムを書きました。 ウィンドウ2が生成されたときに、ウィンドウ1に重なっていると、ウィンドウ2を閉じてもウィンドウ1のクライアント領域にウィンドウ2の形が残ったままになってしまいます。 どうしてこうなるのでしょうか?

専門家に質問してみよう