Search
Categories
Articles
Rainmeter関連
ファイル置き場
お知り合いなど

スポンサーサイト

--.--.-- | スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Rainmeter] MeasureNetはbits/s? それともBytes/s?

2009.10.03 | Rainmeter

0 Comments

MeasureNet(In/Out/Total)はネットワークのトラフィック量を返すMeasureですが、スキンの例を見ていると、単位の扱い方がまちまちです。
例えばBytes/sで表示したいから、Calcを使って8で割って使っていたりとか。

MeasureNetは、内部ではOctet単位で値を保持しています。1Octet=8bitです。今は1Byte=8bitとして扱われてるのでByte単位でもいいです。
だから、Byte単位で表示したいなら、Calcを使って8で割るのは間違いです(OSのバージョンによって挙動が変わるかどうかは知りませんが、少なくともXP上でのRainmeterではOctet単位で管理されています)。

MeasureNet.cppの一部、ReadConfig()ではこんな感じになってます。

/*
** ReadConfig
**
** Reads the measure specific configs. This is the same for in, out and total.
** the net-parameter informs which inherited class called this method.
**
*/
void CMeasureNet::ReadConfig(CConfigParser& parser, const WCHAR* section, NET net)
{
    double value;
    const WCHAR* netName = NULL;
 
    if (net == NET_IN)
    {
        netName = L"NetInSpeed";
        value = CRainmeter::GetGlobalConfig().netInSpeed;
    }
    else if (net == NET_OUT)
    {
        netName = L"NetOutSpeed";
        value = CRainmeter::GetGlobalConfig().netOutSpeed;
    }
    else
    {
        netName = L"NetTotalSpeed";
        value = CRainmeter::GetGlobalConfig().netInSpeed + CRainmeter::GetGlobalConfig().netOutSpeed;
    }
 
    double maxValue = parser.ReadFloat(section, L"MaxValue", -1);
    if (maxValue == -1) 
    {
        maxValue = parser.ReadFloat(section, netName, -1);
        if (maxValue == -1) 
        {
            maxValue = value;
        }
    }
    
    m_Interface = parser.ReadInt(section, L"Interface", 0);
    m_Cumulative = 0!=parser.ReadInt(section, L"Cumulative", 0);
 
    m_TrafficValue = parser.ReadFloat(section, L"TrafficValue", 0.0);
    m_TrafficAction = parser.ReadString(section, L"TrafficAction", L"", false);
 
    if (maxValue == 0)
    {
        m_MaxValue = 1;
        m_LogMaxValue = true;
    }
    else
    {
        m_MaxValue = maxValue / 8;
    }
}

ヘルプには、NetXXXSpeed(またはMaxValue)の指定は"bits per second"ですると書かれています。この記述や、一般的にネットワークの通信速度を表すのにbpsを使うことから、「MeasureNetはbit単位を返す」と勘違いさせてしまうこともあるのかなぁと。
実際には、NetXXXSpeed(またはMaxValue)は赤字の箇所でOctet単位に直して使っています。bitだったりOctet(Byte)だったり、ややこしいですね。さらにTrafficActionのためのTrafficValueは8で割ってないのでOctet(Byte)単位で指定しないといけないという(ヘルプにも指定に使う単位が書かれてない)。

というわけで、
- Byte単位で表示したければ、そのまま使う
- bit単位で表示したければ、Calcで8をかけて使う
- オプション指定のNetXXXSpeedはbit単位、TrafficValueはByte単位で指定する
という感じでしょうか……。

ちなみに、AutoScaleを使って表示すると、他アプリで計測した値よりも若干小さく表示されることがあります。この原因は「ハードディスクの容量が1TBあるはずなのに900GBちょっととしか表示されないぞ!」というのと同じようなもので(ちょっと違うけど)、ネットワークの通信量はk(103=1000)→M(106=1000*1000)と計算されていくのに対し、Rainmeter内部ではk(210=1024)→M(220=1024*1024)と計算するためです(どんなMeasureでも1024で割っちゃうので、あまり好きではない仕様です)。

« [Rainmeter-dev] DynamicVariables [Rainmeter-dev] issue 111 »

- Comments
0 Comments

管理者にだけ表示を許可する
- Trackbacks
0 Trackbacks


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。