C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: LogParserをスレッドで負荷をかけるとライブラリが登録


(過去ログ 13 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■3957 / inTopicNo.1)  LogParserをスレッドで負荷をかけるとライブラリが登録
  
□投稿者/ 中博俊 (1085回)-(2007/05/30(Wed) 10:05:21)
中博俊 さんの Web サイト

分類:[Windows 全般] 

こんにちは中です。

わんくま全体のPVを調べないといけないのでLogParserかけていたのですが、うちはCPUgが4個なので、20%くらいしか動いてくれません。
非行率です。

なので処理をすべて非同期で動かすためにキュー化して、delegate.BeginInvokeで並列処理をするようにくんだのですが、LogParserに処理をさせるところで負荷があがると”ライブラリが登録されていません”とエラーになります。

実際にはその状態でがっつり100%CPUにいかないのであきらめましたが。

これってあくまでLogParserの問題なのか、スレッドモデルがの問題なんでしょうか?
引用返信 編集キー/
■3960 / inTopicNo.2)  Re[1]: LogParserをスレッドで負荷をかけるとライブラリが登録
□投稿者/ 渋木宏明(ひどり) (223回)-(2007/05/30(Wed) 11:46:56)
渋木宏明(ひどり) さんの Web サイト
> なので処理をすべて非同期で動かすためにキュー化して、delegate.BeginInvokeで並列処理をするようにくんだのですが、LogParserに処理をさせるところで負荷があがると”ライブラリが登録されていません”とエラーになります。

「負荷がかかると」ってところが怪しいなぁ。

負荷がかかってる時ってのは沢山スレッドが起動されるんですか?
また、負荷がかかってない時にスレッドが起動されていない可能性はあります?

「クラスがみつかりません」てことは、CoCreateInstance() に失敗してるんだと思うんだけど。。。


引用返信 編集キー/
■3967 / inTopicNo.3)  Re[2]: LogParserをスレッドで負荷をかけるとライブラリが登録
□投稿者/ 中博俊 (1086回)-(2007/05/30(Wed) 13:54:12)
中博俊 さんの Web サイト
デリゲート作ってBeginInvokeして、そのIAsyncResultの.WaitHandleを待ち合わせるという仕組みを作って。
それをforでいっぱい作れるようにしたんです。
え?コード書けって。うー手元にない。(^^;;

キューにはファイル名が詰まっているので、それを8多重とかで取り出して表示はできることを確認してて、LogParserのロジックに渡すと、LIBNOREGISTとかってエラー名がでてました。(ちゃんとコピペしろよ)

内部でCoCreateInstanceして返しているので、そこが原因だと思うんですが。
このCOM内部ではシングルトンイメージで動いているって事なんですかね・・・

もしそうならまぁぜったいに無理ってかんじだけど。プロセス分けてもむりってことですよね。それなら。

ちなみにCloseとMarshal.ReleaseComObjectはやってるつもりです。
引用返信 編集キー/
■3987 / inTopicNo.4)  Re[3]: LogParserをスレッドで負荷をかけるとライブラリが登録
□投稿者/ 中博俊 (1087回)-(2007/05/30(Wed) 22:08:33)
中博俊 さんの Web サイト
ライブラリは登録されていません。 (HRESULT からの例外: 0x8002801D (TYPE_E_LIBNOTR
EGISTERED))
   場所 MSUtil.ILogRecordset.getRecord()
   場所 LogParserStatic.LogParserStatic.Parse(ParseCommandArgs Args, String クエ
リ文字列) 場所 f:\mypro2\LogParserStatic\LogParserStatic\Program.cs:行 168
   場所 LogParserStatic.LogParserStatic.ParseCleark(String クエリ文字列) 場所 f:
\mypro2\LogParserStatic\LogParserStatic\Program.cs:行 124
型 'MSUtil.LogQueryClassClass' のオブジェクトを型 'MSUtil.ILogQuery' にキャスト
できません。
   場所 MSUtil.LogQueryClassClass.Execute(String szQuery, Object pObjectInputCon
text)
   場所 LogParserStatic.LogParserStatic.Parse(ParseCommandArgs Args, String クエ
リ文字列) 場所 f:\mypro2\LogParserStatic\LogParserStatic\Program.cs:行 162
   場所 LogParserStatic.LogParserStatic.ParseCleark(String クエリ文字列) 場所 f:
\mypro2\LogParserStatic\LogParserStatic\Program.cs:行 124



            MSUtil.ICOMW3CInputContext input = null;
            #region
            try
            {
                input = new MSUtil.COMW3CInputContextClassClass();
                string 整形済みクエリ文字列 = string.Format(クエリ文字列, Args.ファイル名);
                MSUtil.ILogQuery Query = null;
                #region
                try
                {
                    Query = new MSUtil.LogQueryClassClass();
                    MSUtil.ILogRecordset rs = null;
                    #region
                    try
                    {
                        rs = Query.Execute(整形済みクエリ文字列, input);
                        while (rs.atEnd() == false)
                        {
                            MSUtil.ILogRecord rec = null;
                            try
                            {
                                rec = rs.getRecord();          <<<<<<168行目


ちなみに発生率は低いです。

ついでに8スレッド生成しているのは

            List<WaitHandle> lwh = new List<WaitHandle>();
            for (int lc = 0; lc < 8; lc++)
            {

                Action<string> act = new Action<string>(ParseCleark);
                IAsyncResult iar = act.BeginInvoke(Properties.Settings.Default.Query, null, null);
                lwh.Add(iar.AsyncWaitHandle);
            }
            WaitHandle.WaitAll(lwh.ToArray());

もちろん8個スレッドがあるかどうかはわからないですが。
ま、8である必要もないです。

ついでにLogParserが全力で動いているときはdllhost.exeが20%前後動いてます。
.NET側はほぼ0

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -