- ベストアンサー
OSでの動作スピードの違い
- VC++6.0、Win2000環境で作成したプログラムが、Win98環境で遅くなる理由について知りたいです。
- Win98のOSでは、VC++6.0で作成したアプリの動きが遅くなる現象が発生しているようです。
- Win2000環境では問題なく動作しているアプリが、Win98環境では動きが遅くなるという現象が発生しています。なぜこのような違いが生じるのか疑問です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、honiyonです。 うーん、その仕様ですとシンプルでOS差が出るような点が予想出来ません.(^^; 以下の事を試してみてください。 ・WM_TIMER時のBMP表示やダイアログ処理を全部コメントアウトする。 ・代わりに、MessageBeep(MB_OK); のみを実行するようにする。 これでプログラムを実行してみると、WM_TIMERが発生する毎に何らかの音が出ると思います。OSのサウンド設定が標準のままなら「ポーン」となると思います。 この間隔が Win98上において、マウスをのせた場合と乗せなかった場合で処理差が出る場合は、WM_TIMERの発生が何らかの理由により安定していない事になります。 処理差がでなかった場合は、BMP表示やダイアログ処理で差が出ている事になります。 前者の場合は、申し訳ないですが、はお手上げです(^^; ソースコード全部見て少しずつ検証していくことになります。後者の場合は、BMP表示やダイアログ処理をもう一度見直してみて、分からなかったらそのコードを載せて質問してみましょう。 ところで、Win98は WindowsUpdateで最新の状態に保たれていますか?「まさか」とは思いますが、WindowsUpdateでバグ修正したら直ったりする・・・カモ 参考になれば幸いです(..
その他の回答 (2)
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 もう結構前の事で、具体的にどんなものだったかは覚えていないのですが、確か、 ・DirectXを使ったプログラムで、スクロールが非常に重い ・複数のウインドウやオブジェクトを動かすジョークアプリケーションで、ウインドウの移動が非常に遅い のどちらかだった気がします。 確か私は、DoEventsを処理ループ内には必ず入れ、ループを整理、簡潔化し、オブジェクトの生成も効率化・・・などとしているうちに解消しました汗 DoEventsはお試しになってみましたでしょうか? VC++では、以下の関数を作ることで実現出来ます。 void DoEvents(void){ MSG msg; if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0){ TranslateMessage(&msg); DispatchMessage(&msg); } } とりあえず、処理をあちこちコメントアウトしたり元に戻したりして、「どの処理のせいで減少が発生しているのか?」をつきとめてみてはいかがでしょうか? 色々試してみる前に、それから問題の解決を始めるのが効率が良いと思います。(この一件では人の事言えない解決の仕方してますが、私^^;) 参考になれば幸いです(..
お礼
こんにちは、honiyonさん。 amobanです。 早速のお答え、痛み入ります。 DoEvents はまだ試してないです~。 その前に色々コメントアウトする・・・などはしてたんですが、 結局場所の特定が出来ないというか、分からないままで・・・(泣) ひとまず簡単に今のアプリ(デスクトップアクセサリ)の流れをご説明しますと、 1.見えないダイアログウィンドウを本体として作成 (ここからタスクトレイにアイコンを登録) 2.本体から別のダイアログを生成(実際にBMPファイルを表示するダイアログ。クライアント領域のみ) 3.本体でSetTimer関数でタイマーをセットし、WM_TIMERイベント発生時にOnTimer関数から別ダイアログの表示&移動関数を実行 という流れです。 Windowsプログラムは今回が初めてで右往左往しながらここまでやってきたのですが、 もうこの先はちんぷんかんぷんって感じです(泣)。 DoEvents関数を入れるとしたら、どこがよろしいでしょうか? たびたびのお願い、申し訳ありませんが、宜しくお願いします。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 私も同様の経験がした事があります。 ・・・が、結局明確な原因は分かりませんでした。 ちょっとアルゴリズムを変えてあげたらちゃんと動くようになりました。ナゾな事件でした(^^; そもそもマルチタスクを実現している処理がWin95系とWinNT系では全く違うものでしょうし、それに伴い API関数の実現方法も全く違うものになっている事でしょう。 その差異が現れている、もしくはWin95系の不具合と考えるのが良いかも知れません。 ここからは推測になってしまうのですが、きっとウインドウに割り当てられる処理時間が少ないのだと思います。その為、1秒あたりの処理出来る時間が短くなり、結果として遅くなってしまう。 そこにマウスカーソルを乗せる事で、マウスのイベントが発生する。 すると、どういうわけか一時的に割り当てられる処理時間が増え、処理が速くなる。 じゃあどうすれば良いのか?といえば、私にはよくわかりません(^^; Windowsに気に入られるアプリケーションにしなければ・・・としか笑 とりあえず、VBでいうところの DoEvents のようなメッセージキューを処理するような関数を作成しひんぱんに呼び出してみてはいかがでしょうか? うーん、これで解決するか全く自信ないのですが・・・。 参考になれば幸いです(..
お礼
honiyonさん、こんにちは。 お答えありがとうございます。 Windowsに気に入られるプログラム・・・ どうすればいいんでしょうね(^^; ちなみにタイマー割り込みの時間を短くしてみたりしましたが、 まったく同じようなスピードで動くんです(泣)。 何かの処理を待ってるのかな?って感じです。 ともかく、アルゴリズムの変更でうまくいくことがあるのでしたら、 そういったクセを見抜くしかなさそうですね。 ちなみに、アプリではウィンドウを移動する関数とかを頻繁に使っています。 もし差し支えなければ、honiyonさんの作ったアプリは どのようにアルゴリズムの変更を行ったのか、 どういった類のアプリをおつくりになったのか教えていただけないでしょうか? 厚かましいお願いですが、よければ宜しくお願いします。
お礼
amobanです。 honiyonさん、何度もありがとうございます。 本当に感謝感謝です。 えっと、MessageBeep関数を試してみました。 SetTimer( timeID, 50, NULL);←タイマー設定はこんな感じ 50/1000秒でWM_TIMER発生のはずですが、 Win98で実行すると、約1秒ごとにビープ音が出てます(泣)。 (WIN2000ではうまくいってます) しかしながら、ウィンドウの上にマウスカーソルを載せてみても、 それほどの音の変化はありませんでした。 (気のせいくらいにあるような気がします) ひとまずこれでプログラムの方を見てみようと思いますが・・・ 喜んでいいのやら悲しいやら(泣)。 もう少し調べたらまたご報告します。m(__)m
補足
honiyonさん、おまたせです。^^; amobanです。 ええっとですね、一応見当がつきました。 SetTimer関数で設定したタイマーのタイミングが早すぎるとダメみたいです。 今まで17/1000秒毎でタイマーを設定していましたが、 その設定だと今回のような出来事になりました。 その設定を35/1000秒毎にしてみると、アクティブなウィンドウにマウスカーソルを 合わせる、合わせないにかかわらず、同じタイミングで動いています。 タイマー処理内でフラグを立て、終わるときにフラグを消すということをして、 割り込む処理の重複をさせるようにしていましたが、 それではうまくいかなかったのに・・・・ というやはり不思議な現象です。 処理の重さによって、タイマーのタイミングを変えないといけないのかどうかは、まだ不明です。 まあ、一つ勉強になりましたが、やっぱりWindowsのプログラムは嫌いになりそうです(泣)。 honiyonさんには今回は助けていただいて、 本当にお礼の言いようもありません。 本当にありがとうございました。