とぴやまのブログ

2009/06/23 (Tue)

[]Windowsで実行中のスレッドが動作している論理CPU番号を取得するには

下記URLの内容より。

https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm

GetCurrentProcessorNumber XP


マルチプロセッサ環境Windows アプリケーションにおいて、実行中のスレッドがどのCPUで動作しているかを判断するにはどうするか。

GetCurrentProcessorNumber という API があるが、Windows Vista, Windows Server 2003 以上でしか対応しておらず、Windows XP には対応していないので使用できない。


GetCurrentProcessorNumber Function (Windows) (※Windows Vista, Windows Server 2003 以上)

DWORD WINAPI GetCurrentProcessorNumber(void);

GetCurrentProcessorNumberEx Function (Windows) (※Windows 7, Windows Server 2008 R2 以上)

VOID GetCurrentProcessorNumberEx(__out  PPROCESSOR_NUMBER ProcNumber);

Windows XP で実現するために、これ以外の方法はないだろうか? ということで、分かったのが CPUID 命令。

EAX = 1 にして実行した時に EBX[31:24] に格納される値が、論理CPU番号になる。

DWORD GetCurrentProcessorNumberXP(void)
{
  _asm {mov eax, 1}
  _asm {cpuid}
  _asm {shr ebx, 24}
  _asm {mov eax, ebx}
}

但しこの CPUID 命令自体も Pentium 4 以降でしか対応していないので、CPU 種別の判別処理が必要になる。これにはどう対応すればいいのだろうか? 同じく EAX = 1 の CPUID 命令 での EBX[7:0] ブランド ID 値だろうか? これも昔の CPU では対応していない場合もある。泥沼だ……。

参照:

CPUID (命令) - 通信用語の基礎知識

インテル プロセッサの識別とCPUID命令 (※PDFファイル直リン注意!)

CPUID Modifications for AMD Processors (※AMD CPU の場合)

2009/06/15 (Mon)

[]WZ MAIL 5.0 の送受信時に異常終了するのは何故だ

エディタメーラーを別のソフトに乗り換えようとあれこれ試してみたものの、結局未だに WZ EDITOR 5.0 と WZ MAIL 5.0 を使用し続けている。加えて、全文検索ソフトは「サーチクロス」だ。まさに VillageCenter 信奉者だ。

次期バージョンの 6.0 が「マクロ仕様一新」という形で完全に未来を絶たれてしまった、現状で問題なく動作し続ける以上、使い続けることにした。

さて、手前の環境で WZ MAIL の送受信処理中に異常終了することが多くなったように感じる。PCCore 2 Duoデュアルコア CPU に変えてから、つまり、送受信時のマルチスレッド処理に問題があるのではないかと、調査もせずに根拠もない勝手想像だが、様子見のために WZ MAIL がCPUコア1つでのみ動作する設定を行うマクロを作成してみた。

これを適用すると、子プロセスの MAIL EDITOR までCPU固定設定を引き継いでしまうので、本当ならば送受信時にのみ動作CPU固定設定を行うべきだが、とりあえず保留。

http://www15.ocn.ne.jp/~topiyama/ の 「WZ MAIL拡張 topiyama版」に置く。


2009/06/16 追記:送受信終了のトリガーは、ウィンドウフック関数message が WM_MBSREND の時で良いようだが、開始時のトリガーが不明。IDMコマンドで見た場合は、一括巡回などダイアログを挟む処理でキャンセルしてもその判定が出来ない。

2004 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 04 | 10 |
2011 | 02 |
2012 | 02 |
2014 | 03 |