お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2010-05-14 18:23:45

taku_s
メンバ
登録日: 2008-12-14

TranslateMessage

Ubuntu10.04  G++
質問の題名が思いつかず、分かりにくくてすいません。

ポートの監視などで、whileループを使う場合、CPUが占有されてしまい、他の処理が出来なくなる場合、WindowsのVC++では
TranslateMessage(&msg);
DispatchMessage(&msg);
などを挿入して、一旦システムに処理返すようなことが行われると思いますが、
メッセージループはWindows固有の考え方だろうと思います。

Linuxの場合、どのように対処すれば良いでしょうか?

オフライン

 

#2 2010-05-14 19:33:07

vbk
メンバ
From: Lake Hamana in Hamamatsu
登録日: 2009-12-22

Re: TranslateMessage

CPU占有を避ける方法はいくつかあるかも知れませんが、スリープ関数などを入れてプログラムを一瞬停止させる方法が、OSに限らず簡単だと思います。

例えば、以下は無限ループですが、CPUの使用率はほとんど上がりません。

コード:

while(1)
{
    usleep(1);  // 1マイクロ秒スリープ
}

オフライン

 

#3 2010-05-15 01:51:51

kmz
メンバ
From: kyoto
登録日: 2009-08-13

Re: TranslateMessage

「ポートの監視」がネットワーク・ポートのことを指しているのであれば、select関数を使ってブロッキングしておくとbusyループを避けることができます。

オフライン

 

#4 2010-05-17 03:16:01

loligo
新しいメンバ
登録日: 2010-02-10

Re: TranslateMessage

Windowsで行儀のいいライブラリは待ち合わせ中に適切な頻度でメッセージをディスパッチすべきという作法の話かと思います。これはメッセージを処理するスレッドが待ち合わせのために長時間CPUを占有するとウィンドウの再描画などまで滞ってしまう、などの危惧をしてのことかと思います。そしてそのような処理(作法)はWindows固有のものです。

Windowsでも正確にはメッセージのディスパッチが必要なのはGDIのライブラリを使用する場合だけのはずですが、それがあまりに一般的に使用されるものなので、行儀のいいプログラム/ライブラリでは適切な頻度でディスパッチ処理を暗黙のうちにやっておくべきと認識されています。しかしLinuxでは特別共通に使用されるライブラリはないので、暗黙のうちに必要となる処理はないと思います。強いて似たような処理をあげればシグナル回りくらいですが、waitの際に注意するような話ではありません。

あまり詳しくないので間違っていたらすみません。

オフライン

 

Board footer

Powered by FluxBB