アプリ版:「スタンプのみでお礼する」機能のリリースについて

共有メモリを使うプログラムでCPU負荷が100%になります.対策方法があれば教えてください.
ちなみにCreateFileMapping関数で読み書きを行っています.

A 回答 (3件)

非同期でポーリングしつづけているって事ですか?


どういう使い方をしているのか良くわかりません。

共有メモリに書き込んだ事をEventオブジェクトで通知するとか、Sleepを入れるとか、とにかくポーリング間隔をできるだけ大きくすればいいんじゃないかと。

この回答への補足

開発環境
OS:Win2k, Pen3 500MHz
または
OS:WinXP, Pen4 2.4GHz
コンパイラはいずれもVC++6.0を使用しております.
よろしくおねがいします.

補足日時:2004/12/17 22:27
    • good
    • 0
この回答へのお礼

CPU使用率100%になる原因は,無限ループを使うことで起こりました.共有メモリの操作部分ではなかったです.今,CPU使用率100%のプロセスの優先度を下げるためにCreateProcess関数を使おうと考えております.
Windowsにおけるプログラミングで「CPU使用率100%=悪」というわけではないのですね.
共有メモリはデータを受け渡しすることが目的なのでデッドロックさえ回避すればCPU使用率100%でもちゃんとデータが渡るはずですね.
どうしてもデータが受け渡らなければマルチプログラミングで複数のプロセスのスケジューリングをしてみます.

ご親切に詳細なご説明をありがとうございました.

お礼日時:2004/12/20 19:19

#1です。


現在の状態はこんな感じですよね。

■プロセスA (Writing)
while (1) {
共有メモリに書き込み();
}

■プロセスB (Reading)
while (1) {
共有メモリから読み込み();
読み込んだデータを表示();
}

私ならどうするかでお答えしますが、まずはCreateEventのドキュメントを読んで下さい。
名前付イベントオブジェクトを作成しますが、2つのプロセスで全く同じに作成すれば、後から作成される方は作成済みオブジェクトをオープンします。
lpEventAttributesは必要がなければNULL、bManualResetは自動リセットでいいのでFALSE、bInitialStateは非シグナル状態でいいのでFALSE。lpNameは適当な名前にして下さい。
この例では各プロセスで2つずつ作成しています。

■プロセスB (Reading)
HANDLE handle1 = CreateEvent(NULL, FALSE, FALSE, "name1");
HANDLE handle2 = CreateEvent(NULL, FALSE, FALSE, "name2");
while (1) {
WaitForSingleObject(handle1, INFINITE); // 共有メモリに書き込みされるまで待つ
共有メモリから読み込み();
SetEvent(handle2); // 受け取ったことを通知する
読み込んだデータを表示();
}

このような感じで作成してみて下さい。
必要であればWaitForSingleObject()のタイムアウト値を数秒に設定してタイムアウトの処理を入れて下さい。
WaitForSingleObject()は、指定したオブジェクトがシグナル状態になるまでスレッドを停止させます。CPU負荷は0に近いです。
SetEvent()は、イベントオブジェクトをシグナル状態にします。自動リセットにしているので、WaitForSingleObject()で待ち終われば非シグナル状態に自動で戻ります。

■プロセスA (Writing)
HANDLE handle1 = CreateEvent(NULL, FALSE, FALSE, "name1");
HANDLE handle2 = CreateEvent(NULL, FALSE, FALSE, "name2");
while (1) {
Sleep(1000); // テスト用に少し間隔をあけておく、実際には新たに書き込むデータが定期的に作成されるはず
共有メモリに書き込み();
SetEvent(handle1); // 書き込み終了を通知する。プロセスBのWaitForSingleObjectを呼び出したスレッドが動き出す
WaitForSingleObject(handle2, INFINITE); // 書き込んだデータが受け取られるのを待つ
}

こちらも必要であればタイムアウトの処理などを追加して下さい。
お互いにお互いを待っています。書き方を間違えるとデッドロックするので注意して下さい。

どこか間違っているかもしれませんが、色々試してみてください。
とういか、長文疲れました(笑
    • good
    • 0
この回答へのお礼

長文で詳細な説明をありがとうございます.”CreateEvent”を使うのですね.しかし,私は自作の構造体への読み書きがよくわかりません.
 私が最終的にしたいのは複数のプロセスへの読み書きです.まずは,inthefloiさんが述べられておられるような「2つのプロセス間の読み書き」をしようと考えております.
まだだいぶ違うのでしょうがこういった形になりました.日記のところに書き込みました.ご指導よろしくお願いします.

http://members.goo.ne.jp/home/goo043322

お礼日時:2004/12/18 23:02

#1です。



なんとも誤解があるようですね。
私が書いたのは、2つのプロセス間の読み書きの方法ではなくて、質問にあるように、CPU負荷が100%になる理由と対策についてのヒントです。

それらを足がかりにして、関連するドキュメントを読んで同期について理解を深めれば、プロセスが幾つであっても問題ではないはずです。

頑張ってください。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます.たしかにCPU負荷が少なそうです.CreateEvent関連のドキュメントをチェックしてがんばってみます.それでは.

お礼日時:2004/12/19 13:48

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