No.1
- 回答日時:
非同期でポーリングしつづけているって事ですか?
どういう使い方をしているのか良くわかりません。
共有メモリに書き込んだ事をEventオブジェクトで通知するとか、Sleepを入れるとか、とにかくポーリング間隔をできるだけ大きくすればいいんじゃないかと。
この回答への補足
開発環境
OS:Win2k, Pen3 500MHz
または
OS:WinXP, Pen4 2.4GHz
コンパイラはいずれもVC++6.0を使用しております.
よろしくおねがいします.
CPU使用率100%になる原因は,無限ループを使うことで起こりました.共有メモリの操作部分ではなかったです.今,CPU使用率100%のプロセスの優先度を下げるためにCreateProcess関数を使おうと考えております.
Windowsにおけるプログラミングで「CPU使用率100%=悪」というわけではないのですね.
共有メモリはデータを受け渡しすることが目的なのでデッドロックさえ回避すればCPU使用率100%でもちゃんとデータが渡るはずですね.
どうしてもデータが受け渡らなければマルチプログラミングで複数のプロセスのスケジューリングをしてみます.
ご親切に詳細なご説明をありがとうございました.
No.2ベストアンサー
- 回答日時:
#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); // 書き込んだデータが受け取られるのを待つ
}
こちらも必要であればタイムアウトの処理などを追加して下さい。
お互いにお互いを待っています。書き方を間違えるとデッドロックするので注意して下さい。
どこか間違っているかもしれませんが、色々試してみてください。
とういか、長文疲れました(笑
長文で詳細な説明をありがとうございます.”CreateEvent”を使うのですね.しかし,私は自作の構造体への読み書きがよくわかりません.
私が最終的にしたいのは複数のプロセスへの読み書きです.まずは,inthefloiさんが述べられておられるような「2つのプロセス間の読み書き」をしようと考えております.
まだだいぶ違うのでしょうがこういった形になりました.日記のところに書き込みました.ご指導よろしくお願いします.
http://members.goo.ne.jp/home/goo043322
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CPU・メモリ・マザーボード CPUデュアルチャネルについて。 2 2022/12/17 12:26
- ビデオカード・サウンドカード メイン機とは別に、初自作としてpcを組みました。 pcスペック cpu ryzen5 5500 グラ 1 2023/05/15 12:22
- ドメイン・サーバー・クラウドサービス VPSの会社から高負荷のためインスタンス停止のお知らせが来た。どうすれば・・・ 2 2023/02/20 16:03
- ノートパソコン celeronはまだゴミですか? 8 2022/11/19 13:41
- MySQL データベースの検索で、この場合、どの程度負荷になりますか? 3 2022/04/11 04:45
- CPU・メモリ・マザーボード AG03mk2使用時にデバイスが認識されなくなる【B550 phantom gaming 4】 2 2023/02/11 05:21
- CPU・メモリ・マザーボード CPUがメモリ上の命令を実行する流れについての質問です。 3 2023/05/05 01:41
- CPU・メモリ・マザーボード CPUがメモリ上に書かれている命令を実行した後の流れについての質問です。 1 2023/05/05 01:18
- CPU・メモリ・マザーボード CPUがメモリ上の命令を実行した後の流れについての質問です。 1 2023/05/05 01:36
- BTOパソコン パソコン工房で静音化アップデートをしようと思ってるのですが 4 2022/05/25 19:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
プロセスIDからウィンドウハ...
-
ShellExecuteExでハンドルの取得
-
別のプロセスの関数を呼び出す...
-
プロセスが実行中かどうか調べ...
-
Windowsでのfork方法
-
C#でのbatファイル実行結果取得
-
VC++6.0 「プロセスへ...
-
ロードアベレージが高いのです...
-
プロセスのアタッチ・デタッチ...
-
AppActivate関数について
-
非表示になったエクセルは?
-
他のEXEが起動しているかの確認
-
c言語でプロセスIDを調べたい
-
別プロセスをの実行パスを取得...
-
CreateObjectで作成したExcelの...
-
子プロセスのデバッグ方法について
-
警告『 別のプロセスで使用され...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
VB6.0 SHELLで起動...
-
プロセスIDからウィンドウハ...
-
Process.Startの戻り値を後で取得
-
ウィンドウのタイトルからプロ...
-
他のEXEが起動しているかの確認
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Linuxでのスレッド間メッセージ...
-
C++でシェルを起動
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
Windowsでのfork方法
おすすめ情報