Windows Performance Analyzerの使い方。
http://blogs.msdn.com/b/jpwdkblog/archive/2014/11/28/windows-performance-analyzer.aspx
ダウンロード先。
https://msdn.microsoft.com/en-us/library/windows/desktop/hh448170.aspx
Windows Performance Analyzerの使い方。
http://blogs.msdn.com/b/jpwdkblog/archive/2014/11/28/windows-performance-analyzer.aspx
ダウンロード先。
https://msdn.microsoft.com/en-us/library/windows/desktop/hh448170.aspx
以下のC#のプログラムで、最後にある「 foreach (Principal r in results) 」が実行された時に、「While trying to resolve a cross-store reference, the target principal could not be found in the domain indicated by the principal's SID.」例外が発生する原因がどうにも分からず、マイクロソフトに聞いてみたら、回答を貰えました。
【例外が発生するソース】
using (Principal principal = GetPrincipal(searchSid, null))
{
if (principal == null)
return null;
switch (principal.StructuralObjectClass)
{
case "group":
using (GroupPrincipal gPrincipal = principal as GroupPrincipal)
{
using (PrincipalSearchResult results = gPrincipal.GetMembers())
{
if (results == null)
{
return null;
}
foreach (Principal r in results)
{
【例外の内容】
e.Data=System.Collections.ListDictionaryInternal e.HelpLink=
e.InnerException= e.Message=While trying to resolve a cross-store reference, the target principal could not be found in the domain indicated by the principal's SID.
e.Source=System.DirectoryServices.AccountManagement e.StackTrace=
at
System.DirectoryServices.AccountManagement.ADStoreCtx.ResolveCrossStoreRefToPrincipal(Object o)
at
System.DirectoryServices.AccountManagement.ADUtils.DirectoryEntryAsPrincipal(DirectoryEntryde, ADStoreCtx storeCtx)
at
System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.get_CurrentAsPrincipal()
at
System.DirectoryServices.AccountManagement.FindResultEnumerator`1.get_Current()
【Microsoftからの回答】
このエラーは、マルチドメイン環境で、ドメインサーバ間でユーザが重複していて、更にC#のPrincipalを使ってSIDの情報を取得してい ると発生します。 PrincipalクラスではなくDirectoryEntoryクラスを使うようにするか、ドメインサーバ間でユーザの重複を解消するか、どちらかの対策を行えば、このエラーは発生しなくなるはずです。
1、Visual Studio Community 2013 を起動し、メインメニューの「プロジェクト」を選択する。
2、「新しいプロジェクト」画面で、.Net Framework は「4.0」以上を選択、「Windows フォーム アプリケーション」を選択する。 他は任意に設定し「OK」ボタンをクリックする。
3、「参照設定」を右クリックし、「参照の追加」を選択する。
4、「参照マネージャ」画面で「参照」ボタンをクリックする。
5、「参照するファイルの選択」画面で、「fxcore2.dll」を選択し「追加」ボタンをクリックする。
C:\Program Files\Candleworks\ForexConnectAPIx64\bin\fxcore2.dll
6、「参照マネージャー」画面に追加されるので、そのまま「OK」ボタンをクリックする。
7、以下のDLLは、プログラムの実行フォルダに予めコピーしておかないと、プログラム実行時に障害が発生する。
【コピー元DLL】
C:\Program Files\Candleworks\ForexConnectAPIx64\bin\net\dotnet40\
ForexConnect.dll
fxmsg.dll
fxtp.dll
gsexpat.dll
gstool3.dll
gszlib.dll
httplib.dll
log4cplus.dll
msvcp80.dll
msvcr80.dll
pdas.dll
【コピー先フォルダ ※Visual Stduio デバッグ実行の場合】
(Visual Studio プロジェクトフォルダ)\bin\
【コピー先フォルダ ※Releseビルド後】
(プログラムトレード アプリケーション実行フォルダ fxcore2.dllがあるところ)\
1、API User Guide 「C:\Program Files\Candleworks\ForexConnectAPIx64\doc\chm\ForexConnectAPINET.chm」を開くと、以下のようなヘルプアプリが表示されます。 APIのヘルプはこういう形態になっている事が多いです。 「Getting Started」章あたりから徐々に慣れていきましょう。
2、ヘルプの雰囲気に慣れたら、次は FXCM API のサンプルプログラムに慣れましょう。 以下のファイルを Visual Studio ソリューション で開きます。
3、Visual Studio 2013 を使っていると、ソリューションのアップデート画面が表示されます。そのまま「OK」をクリック。
4、ソリューションをリビルドし、エラーが発生しないことを確認。
5、「Login」プロジェクトがあるので、最初にここから攻略します。
6、App.config を開き、{LOGIN} {PASSWORD} それぞれに、デモ口座のIDとパスワードを入力し、プログラムからログインできる事を確認します。
session.login()メソッドでログインしています。
この要領で、プログラムトレードで必要となる基本機能や、トレード理論上必要になる値の取得方法を、ヘルプ(ForexConnectAPINET.chm)で調べ、サンプルプログラムで使い慣れて行きます。
マイクロソフトがドキュメント コメント用の推奨タグ (C# プログラミング ガイド)を公開しているので、今後は、コメントのコーディング規約をこれにしてしまえば、コメントの書き方について悩まなくて済む。
staticを宣言したメソッドであっても、メソッド内で宣言されている変数はマルチスレッド間で共有されず、クラスのstaticメンバ変数は共有される。
staticメソッド内で宣言されている変数がマルチスレッド間で共有されないのは、変数のスコープ仕様的に、whileループの中で宣言された変数が、その外側では使えないのと同じ。
この事から、スタックメモリで実行されるstaticメソッドを、マルチスレッドアプリケーションで利用しても、安全だと分かる。
以下、実験したソースと実行結果。
実験に使用したVisual Studio 2013のプロジェクトファイル => Src2をダウンロード
メソッド内の変数を使ってループするstaticメソッドと、クラスのstaticメンバ変数を使ってループするstaticメソッド。これをシングルスレッド、マルチスレッドそれぞれで検証する。
// staticメソッド群を、マルチスレッドで実行するためのメソッド群
public class CVariable実験1
{
// メソッド内の変数を使ってループするメソッド
public void VariableTest1(object id)
{
CVariable実験2.VariableTest1(id);
}
// クラスのメンバ変数を使ってループするメソッド
public void VariableTest2(object id)
{
CVariable実験2.VariableTest2(id);
}
}
// staticメソッド群
public static class CVariable実験2
{
private static long mCnt = 0;
// メソッド内の変数を使ってループするメソッド
public static void VariableTest1(object id)
{
string FileName = "result_" + id + ".txt";
if (File.Exists(FileName)) File.Delete(FileName);
long iCnt = 0;
string tmp = null;
while (iCnt < 1000)
{
tmp = id + " " + iCnt.ToString() + "\r\n";
System.Diagnostics.Debug.WriteLine(tmp);
File.AppendAllText(FileName, tmp);
iCnt++;
}
}
// クラスのメンバ変数を使ってループするメソッド
public static void VariableTest2(object id)
{
string FileName = "result_" + id + ".txt";
if (File.Exists(FileName)) File.Delete(FileName);
string tmp = null;
mCnt = 0;
while (mCnt < 1000)
{
tmp = id + " " + mCnt.ToString() + "\r\n";
System.Diagnostics.Debug.WriteLine(tmp);
File.AppendAllText(FileName, tmp);
mCnt++;
}
}
}
1、メソッド内の変数でループするstaticメソッドを、シングルスレッドで実行する。
private void 実証実験1()
{
var Variable実験 = new CVariable実験1();
Variable実験.VariableTest1("A");
Variable実験.VariableTest1("B");
Variable実験.VariableTest1("C");
}
実行結果は、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999がそれぞれ出力される。
2、メソッド内の変数でループするstaticメソッドを、マルチスレッドで実行する。
private void 実証実験2()
{
var Variable実験 = new CVariable実験1();
var i1 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1));
var t2 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1));
var t3 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1));
i1.Start("A");
t2.Start("B");
t3.Start("C");
}
実行結果は、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999がそれぞれ出力される。 staticメソッド内で宣言されている変数は、マルチスレッド間で共有されない。
3、クラスのstaticメンバ変数でループするstaticメソッドを、シングルスレッドで実行する。
private void 実証実験3()
{
var Variable実験 = new CVariable実験1();
Variable実験.VariableTest2("A");
Variable実験.VariableTest2("B");
Variable実験.VariableTest2("C");
}
実行結果は、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999がそれぞれ出力される。
4、クラスのstaticメンバ変数でループするstaticメソッドを、マルチスレッドで実行する。
private void 実証実験4()
{
var Variable実験 = new CVariable実験1();
var i1 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2));
var t2 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2));
var t3 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2));
i1.Start("A");
t2.Start("B");
t3.Start("C");
}
実行結果は、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999までの値がランダムに、1ファイル辺り330行程度出力される。 クラスのstaticメンバ変数は、マルチスレッド間で共有される。
インスタンスを分けても、クラスのstaticメンバ変数は、マルチスレッド間で共有される。
メソッド内で宣言されている変数はマルチスレッド間では共有されず、クラスのメンバ変数は共有される。 変数のスコープ仕様的に、whileループの中で宣言された変数が、その外側では使えないのと同じ。
以下、実験したソースと実行結果。
実験に使用したVisual Studio 2013のプロジェクトファイル => Srcをダウンロード
メソッド内の変数を使ってループするメソッドと、クラスのメンバ変数を使ってループするメソッド。これをシングルスレッド、マルチスレッドそれぞれで検証する。
public class CVariable実験1
{
long mCnt = 0;
// メソッド内の変数を使ってループするメソッド
public void VariableTest1(object id)
{
string FileName = "result_" + id + ".txt";
if (File.Exists(FileName)) File.Delete(FileName);
long iCnt = 0;
string tmp = null;
while (iCnt < 1000)
{
tmp = id + " " + iCnt.ToString() + "\r\n";
System.Diagnostics.Debug.WriteLine(tmp);
File.AppendAllText(FileName, tmp);
iCnt++;
}
}
// クラスのメンバ変数を使ってループするメソッド
public void VariableTest2(object id)
{
string FileName = "result_" + id + ".txt";
if (File.Exists(FileName)) File.Delete(FileName);
string tmp = null;
mCnt = 0;
while (mCnt < 1000)
{
tmp = id + " " + mCnt.ToString() + "\r\n";
System.Diagnostics.Debug.WriteLine(tmp);
File.AppendAllText(FileName, tmp);
mCnt++;
}
}
}
1、メソッド内の変数でループするメソッドを、シングルスレッドで実行する。
private void 実証実験1()
{
var Variable実験 = new CVariable実験1();
Variable実験.VariableTest1("A");
}
実行結果、result_A.txtファイルに1~999が出力される。
メソッド内で宣言されている変数は、マルチスレッド間で共有されない。
2、メソッド内の変数でループするメソッドを、マルチスレッドで実行する。
private void 実証実験2()
{
var Variable実験 = new CVariable実験1();
var i1 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1));
var t2 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1));
var t3 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest1));
i1.Start("A");
t2.Start("B");
t3.Start("C");
}
実行結果、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999がそれぞれ出力される。
メソッド内で宣言されている変数は、マルチスレッド間で共有されない。
3、クラスのメンバ変数でループするメソッドを、マルチスレッドで実行する。
private void 実証実験3()
{
var Variable実験 = new CVariable実験1();
var i1 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2));
var t2 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2));
var t3 = new Thread(new ParameterizedThreadStart(Variable実験.VariableTest2));
i1.Start("A");
t2.Start("B");
t3.Start("C");
}
実行結果、result_A.txt、result_B.txt、result_C.txtの3ファイルに、1~999が3分割された値が出力される。1ファイル辺り330行程度が出力される。
クラスのメンバ変数は、マルチスレッド間で共有される。
インスタンスを分ければ、クラスのメンバ変数も、マルチスレッド間で共有されなくなる。
※クラスのメンバ変数でループするメソッドを、シングルスレッドで実行するケースは、メソッド内の変数でループするメソッドを、シングルスレッドで実行した場合と、同じ結果になる事は明白なので実験していない。
最初のシーク位置を5バイト目に変更したあと、5バイト目から7バイト目を読込み、それ以降のデータを、1行づつ読込むサンプルソース。
string filename = @"C:\work\04_blog\01_調査\C#シーク処理\FileRead\testData\test.txt";
using (FileStream fp = new FileStream(filename, FileMode.Open, FileAccess.Read))
using (StreamReader sr = new StreamReader(fp))
{
char[] buff = new char[2];
fp.Position = 5; // 最初のシーク位置を5バイト目に変更
int readlen = sr.Read(buff, 0, buff.Length); // 5バイト目から7バイト目を読込み
string result = new string(buff);
System.Diagnostics.Debug.WriteLine(result);
while (sr.Peek() > -1)
{
System.Diagnostics.Debug.WriteLine(sr.ReadLine()); // 1行づつ読込む
}
}
「C言語 + OCI」で実行されていたSQLを、C#へ移植する際、C言語の時に使われていた改行コード「\n」をそのままにし、C#からOracleに対しSQLを発行すると、以下のエラーが発生した。
ORA-06550: 行1、列2432: PLS-00103: 記号"end-of-file"が見つかりました。 次のうちの1つが入るとき:
( begin case declare end exception exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge
declare、begin、end;を使うような長文SQLを、C#から単独実行する場合、プロシージャ化するしかないのかとも疑ったが、C言語の時、SQLの改行コードに使っていた「\n」が、C#では使えないのが原因だった。 「\r\n」へ置換する事で、このエラーは発生しなくなった。
改行コードが、\n、\r\n のどちらであっても、SQL Developerからはエラー無く実行でき、エラーMSGからは解決策を見いだせなかったのでハマった。
変更前
"declare\n" +
変更後
"declare\r\n" +
最近のコメント