最近の記事
- Youtubeやニコニコ動画のサムネイルをアートワークにするためのソフト (11/26)
- スレッドの怪 (11/21)
- Contains遅い。 (11/08)
- javaかC#か (11/07)
- おすすめ探索の考察 (11/06)
リンク
$suiの成分分析
$suiの成分分析
Amazon人気商品
月別アーカイブ
カテゴリー
- 未分類 (5)
- javascript (0)
- Greasemonkey (2)
- PHP (5)
- オブジェクト指向 (2)
- メモ (1)
- Googleガジェット (2)
- Perl (1)
- ブログプラグイン (3)
- 不具合 (2)
- C# (7)
- MySQL (2)
- グラフ理論 (1)
- プログラミング (1)
RSSフィード
ブログ内検索
FC2アフィリエイト
タグ+カテゴリ クラウド
大学で習うレベルだと「誰が得するんだよ」って程度にしか考えてなかったスレッドだけど
ほんとにちょっと使えるプログラム作ろうとするとありがたいもんで。
しかしなんだかC#でのスレッドの挙動が奇妙。
iTunesのトラックにアートワークをがしがし設定させる部分で
何故か全部スレッドはき出すと終了してしまう。
private void Work()
{
IITTrack[] t= it.GetTracks(); //どこぞから設定するトラックをもってくる
for (int i = 0; i < this.one_page; i++)
{
if (i > t.Length)
{
//トラックを設定するメソッドをスレッドで走らせる。
Thread th = new Thread(this.trackArray.GetArray()[i].SetTrack);
th.Start((t[i]));
}
//↓こいつを入れると何故か終了しない。☆
//Debug.Writeline(i);
}
}
・☆のデバッグ用の行を吐けば終了しないでくれる。
・デバッグ行をifブロック内に入れるとやはり終了される。
・スレッドをコメントアウトすれば終了しない。
private void Work()
{
IITTrack[] t= it.GetTracks(); //どこぞから設定するトラックをもってくる
for (int i = 0; i < this.one_page; i++)
{
if (i >= t.Length)
{
break;
}
//if文を使用せずにスレッドを走らせる。
Thread th = new Thread(this.trackArray.GetArray()[i].SetTrack);
th.Start((t[i]));
}
}
この文で問題は消えた。
しかし原因は全くの謎。thread走らせてるメソッド内で事件が起きてる可能性もかなりありそうだけど
ほんとにちょっと使えるプログラム作ろうとするとありがたいもんで。
しかしなんだかC#でのスレッドの挙動が奇妙。
iTunesのトラックにアートワークをがしがし設定させる部分で
何故か全部スレッドはき出すと終了してしまう。
private void Work()
{
IITTrack[] t= it.GetTracks(); //どこぞから設定するトラックをもってくる
for (int i = 0; i < this.one_page; i++)
{
if (i > t.Length)
{
//トラックを設定するメソッドをスレッドで走らせる。
Thread th = new Thread(this.trackArray.GetArray()[i].SetTrack);
th.Start((t[i]));
}
//↓こいつを入れると何故か終了しない。☆
//Debug.Writeline(i);
}
}
・☆のデバッグ用の行を吐けば終了しないでくれる。
・デバッグ行をifブロック内に入れるとやはり終了される。
・スレッドをコメントアウトすれば終了しない。
private void Work()
{
IITTrack[] t= it.GetTracks(); //どこぞから設定するトラックをもってくる
for (int i = 0; i < this.one_page; i++)
{
if (i >= t.Length)
{
break;
}
//if文を使用せずにスレッドを走らせる。
Thread th = new Thread(this.trackArray.GetArray()[i].SetTrack);
th.Start((t[i]));
}
}
この文で問題は消えた。
しかし原因は全くの謎。thread走らせてるメソッド内で事件が起きてる可能性もかなりありそうだけど
DictionaryだのList型では要素があるかどうかをチェックするとき
if(dictionary[key]==null)
としたい。
しかし例外が帰ってきてしまうのでこれは出来ない。
C#の例外処理は重くなるのでなるべく使いたくない。
そのためにこんな感じのを使ってきていた
if(dictionary.ContainsKey(key))
が、重い。驚異的に重い。
特にDirectory等が大きいときは死にたくなる重さ。
で、ちょっと調べるとこんなんがあるらしい。
if(dictionary.TryGetValues(key,out result)
keyに検索キーを入れてその結果がresultに返ってくる。
速度はいい。けどチェックするだけならresultをいちいち作るのが邪魔。
空オブジェクトでも入れておけばいいのかもしれんがそんなやり方がわからない。
なんだかんだでHashtableを使ってしまうのが一番楽なんじゃなかろうか。
Hashtableであれば
if(hash[key]==null)
で可能。
なんかこれの方が楽じゃね?
まあHashtableは型指定ががっちりしてない分使いづらいところあるけど
if(dictionary[key]==null)
としたい。
しかし例外が帰ってきてしまうのでこれは出来ない。
C#の例外処理は重くなるのでなるべく使いたくない。
そのためにこんな感じのを使ってきていた
if(dictionary.ContainsKey(key))
が、重い。驚異的に重い。
特にDirectory等が大きいときは死にたくなる重さ。
で、ちょっと調べるとこんなんがあるらしい。
if(dictionary.TryGetValues(key,out result)
keyに検索キーを入れてその結果がresultに返ってくる。
速度はいい。けどチェックするだけならresultをいちいち作るのが邪魔。
空オブジェクトでも入れておけばいいのかもしれんがそんなやり方がわからない。
なんだかんだでHashtableを使ってしまうのが一番楽なんじゃなかろうか。
Hashtableであれば
if(hash[key]==null)
で可能。
なんかこれの方が楽じゃね?
まあHashtableは型指定ががっちりしてない分使いづらいところあるけど
C#にはRandomがあるがどうもこれがやたらと重いらしいことがわかった。
rnd.next()とかが遅いのではなく
Random rnd = new Random()が遅いらしい。
どっか小さいクラス無いでバカバカインスタンス生成させてるとものすごい遅さになってしまった。
で、まずやってみたのが各クラスに一個ずつRandomを持たせてやること。
ただここで思ったのが同時タイミングで生成されてしまうとseedが同じになってしまう
これが若干まずそう
ということでメインプログラムにstaticで一個生成してそれをどこでも使いまわすようにした。
それもそれでやぼったいやり方だけどかなり速度があがった
rnd.next()とかが遅いのではなく
Random rnd = new Random()が遅いらしい。
どっか小さいクラス無いでバカバカインスタンス生成させてるとものすごい遅さになってしまった。
で、まずやってみたのが各クラスに一個ずつRandomを持たせてやること。
ただここで思ったのが同時タイミングで生成されてしまうとseedが同じになってしまう
これが若干まずそう
ということでメインプログラムにstaticで一個生成してそれをどこでも使いまわすようにした。
それもそれでやぼったいやり方だけどかなり速度があがった
| ホーム |



