トップページ⇒tech
1001コメント299KB

C#, C♯, C#相談室 Part42

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2007/08/26(日) 12:42:25
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C#, C♯, C#相談室 Part41
http://pc11.2ch.net/test/read.cgi/tech/1184840053/

過去スレは>>2-5あたり。
0910デフォルトの名無しさん2007/09/23(日) 19:34:13
>>909
struct Mystruct { public string Str;}
class MyClass{
public Mystruct 中身を中身をいじる(Mystruct strMyClass){
strMyClass.Str = "いじられた";
return strMyClass;
}
}
class MyClass2{
public void MyMethod(){
MyClass myClassObj = new MyClass();
Mystruct myStructObj = new Mystruct();
myClassObj.中身を中身をいじる(myClassObj);
}
}
09119102007/09/23(日) 19:35:39
>>910訂正
×myClassObj.中身を中身をいじる(myClassObj);
○MyStruct いじられた結果 = myClassObj.中身を中身をいじる(myStructObj);
0912デフォルトの名無しさん2007/09/23(日) 20:20:47
>>909>>910>>911
解決しました本当にありがとうございます(ペコリ
0913デフォルトの名無しさん2007/09/23(日) 20:21:30
>>908>>910>>911
(ペコリ
0914デフォルトの名無しさん2007/09/23(日) 20:57:31
なんじゃあこりゃあ
0915デフォルトの名無しさん2007/09/23(日) 23:44:15
ボタンのクリックイベントハンドラ
private void mnLStart_Click(object sender, System.EventArgs e)
{
 Thread thread = new Thread(new ThreadStart(〜〜〜));
 thread.Start();
}
のようにスレッドを開始し、そのスレッド長いこと処理をしているとします。
thread はスコープを抜けているのでそのスレッドを参照できませんよね

そうするとスレッドが実行中でもGCによって回収されるのでしょうか?
実行が終わるまで回収はされないのでしょうか?されないとするとなぜですか?
0916デフォルトの名無しさん2007/09/23(日) 23:49:45
http://msdn2.microsoft.com/ja-jp/library/system.threading.thread.aspx
> スレッドが開始した後は、Thread オブジェクトへの参照を保持する必要はありません。
> スレッドは、そのスレッドの処理が完了するまで実行を継続します。
0917デフォルトの名無しさん2007/09/23(日) 23:58:03
スレッドオブジェクト自身が自分をどこかに登録してるんだろ
0918デフォルトの名無しさん2007/09/24(月) 00:07:31
>>917
どこかにって・・・
そんないい加減な知識で書いてて怖くないんですか?
0919デフォルトの名無しさん2007/09/24(月) 00:23:03
スレッド作って放置するという状況ってのが皆無じゃないか?
2重にスレッドつくっちゃわないよう監視するとかしないのかい?
0920デフォルトの名無しさん2007/09/24(月) 00:24:21
スレッドは放置だろ
0921デフォルトの名無しさん2007/09/24(月) 00:26:23
>>918
別にメインメソッドに対応するThreadオブジェクトを
参照しなきゃって人は居ないんだし、
なんで新しく作ったスレッドだけ怖がるの?
0922デフォルトの名無しさん2007/09/24(月) 00:29:49
>>918
何も使うなよもう。

どこかで覚えててうまく動く仕組みになってる、
以上の詳細を知る必要なんてほとんどの場合はないだろ。
0923デフォルトの名無しさん2007/09/24(月) 00:31:27
>>915
SSCLI読んでからまたおいで
0924デフォルトの名無しさん2007/09/24(月) 00:32:53
スレッドを監視したり止めたりしなきゃならない状況が
もう失敗って感じだしな
0925デフォルトの名無しさん2007/09/24(月) 00:40:34
>>922
あなたはプログラマには向かない、
0926デフォルトの名無しさん2007/09/24(月) 00:45:44
どうでもいいよそんなこと
0927デフォルトの名無しさん2007/09/24(月) 01:36:48
隠蔽されているものをタシーロしたくなる気持ちは分かるけど・・・
隠されているものは隠されているから良いのであって、世の中の人間全てが田代じゃないと思うわけだ
0928デフォルトの名無しさん2007/09/24(月) 01:41:32
>>924でFA
09299192007/09/24(月) 01:52:56
>>924
そりゃ、どんな状況下でスレッド使うことを想定してるんだ?
ボタンのクリックでスレッド開始するってんだろ?
ボタン2度押しされたら?とか考えんのか?
長い処理だと、途中で強制停止させたい。
とかもあるかもだろ。

0930デフォルトの名無しさん2007/09/24(月) 02:00:33
ゆとりだから突っ込むなw
0931デフォルトの名無しさん2007/09/24(月) 02:04:19
スレッドの監視ってのが意味分からんのだが
0932デフォルトの名無しさん2007/09/24(月) 02:22:41
まんま過ぎてどう説明すればいいかよくわからんのだが
どういうイメージしてるか教えてくれんか
09339192007/09/24(月) 02:26:42
親から作ったスレッドに対して
Thread.IsAlive とか Thread.Join とか
することをいってたんだが。
つうか、俺は質問者>>915=918じゃないから
消えるわ。あらしてすまんかった。
0934デフォルトの名無しさん2007/09/24(月) 04:53:52
System.Xml.Linqのクラスリファレンスって、どこかにありますか?
0935デフォルトの名無しさん2007/09/24(月) 05:02:07
>>934
Orcasのベータに付いてくるMSDNにはあったと思う。
既にWebのMSDN Onlineに反映されてるかは自分で調べてくれ。
0936デフォルトの名無しさん2007/09/24(月) 10:19:49
>>935
ぬぅ、Orcasいれなきゃ駄目ですか・・。
ありがとうございます。
0937デフォルトの名無しさん2007/09/24(月) 16:07:54
>>925w
契約違反行為しなきゃ分からんこともいっぱいあるのに
ソースやら調べでもアンドキュメントな実装詳細なんてバージョンで変わるかも知れんのに

ご苦労なことだ。

だいたいカレントスレッドのThreadオブジェクト取得するプロパティやらあるのに
つまり何らかの形で保持されてるのは明らかなのに
それでも信用できないのか?
0938デフォルトの名無しさん2007/09/24(月) 16:30:36
マルチスレッドの質問なんですが、

・複数のスレッドで参照される変数にはvolatileキーワードが必須。
・値を更新するスレッドが1つだけの場合は、それだけでOK。
・複数スレッドで値を更新する場合はlock()して値を更新する。

この認識で合ってますか?
0939デフォルトの名無しさん2007/09/24(月) 16:40:35
合ってない。
ってかそんな単純なことじゃない。
0940デフォルトの名無しさん2007/09/24(月) 16:42:58
ちなみにCLRだとvolatileがほんとに必須なことってほとんど無い気がする。
0941デフォルトの名無しさん2007/09/24(月) 16:46:00
だいたいスレッドを監視しなきゃならないなら
Threadを自分で覚えとくんだろうからGCなって関係ないし、
自分で覚えとか無いなら使わないんだろうから、
Thread自体がどうだろうがスレッドがきちんと動いてるならどうでもいいし
何が怖いのかわからない。
0942デフォルトの名無しさん2007/09/24(月) 17:14:13
>>938
更新スレッドが一つでもあれば参照スレッドにおいても一般に同期は必要。
参照スレッドだけならvolatileも同期機構も不要。

そんな難しいことじゃないんでどういう時にどんな問題が起こりうるか自分で考えてみれ。
0943デフォルトの名無しさん2007/09/24(月) 17:20:22
volatileって単にコンパイル時の最適化を抑制するだけじゃないのん?
0944デフォルトの名無しさん2007/09/24(月) 17:23:03
>>943
それはCの話でC#のvolatileはメモリバリアの意味をちゃんと持ってるよ。
0945デフォルトの名無しさん2007/09/24(月) 17:48:25
64ビット値の読み書きを複数スレッドから効率よくやるいい方法って無いかいな?
64ビットを32ビット単位じゃなくアトミックに扱えればいいだけなんだが。

javaと違ってvolatileではできないってかつけれられないし、
Interlocked.ReadとInterlocked..Exchangeはなんか大げさってか重い。

例えばファイル更新時刻のチェックを行う場合に、毎回ファイル情報をリフレッシュすると無駄が多いので、
例えば前回チェックから1秒以上立ってたら再度チェックを行いたいような場合、
チェック時のDateTime(もしくはそれのTicks値)をフィールドに覚えておいて、
チェック前にDateTime.Nowと比較して1秒以上経過してるか確認したい。
経過してるなら実際のファイル更新時刻チェックを行って、ファイルの再読み込みなど。

この、現在時刻と前回チェック時刻を比較する際に、情報が64ビットなので
64ビットをアトミックに扱えない(32ビット環境の場合)。
単純にやるならlockでいいんだけど、64ビット環境とかだとそもそも不要なのでなんか悔しい。
かといってこれのチェックだけのためだけにInterlocked何回も使うと、もはやlock一発の方が効率よさそう。

IntPtrを調べて64ビットなら何もしない、32ビットならlockってやるか、
もう単純にlockするだけが結局一番いいんだろうか…
0946デフォルトの名無しさん2007/09/24(月) 17:58:53
Int64で十分。そんなことに拘るならC#なんか使うな。
0947デフォルトの名無しさん2007/09/24(月) 18:05:42
>>945
CLRがアライメント考慮しないから
Interlockedクラスのlong引数版は使うなって書いてあるよ。Jeffery本に。

64bit値をプロパティにして読み書きを一ヶ所で行うようにして
そこでlockなりなんなりやっておけば良さそうな気はするけどね。
負荷はどうでもよくて、そうしておいた方が
あとでリファクタリングしやすそうという程度の理由だけど。

個人的にはファイル情報なんか見に行ってファイルアクセスが発生したときの
何百万クロック単位のブロックの方が気になるかな。
0948デフォルトの名無しさん2007/09/24(月) 18:30:24
>>947
その何百万クロックを防ぐために二重チェックするという話なのでは。
と一応つっこんでおく。本題とはあまり関係ないけど。
0949デフォルトの名無しさん2007/09/24(月) 18:32:03
>>945
C# なんだし、FileSystemWatcher 使えば?
0950デフォルトの名無しさん2007/09/24(月) 19:16:58
>>947
>CLRがアライメント考慮しないから
>Interlockedクラスのlong引数版は使うなって書いてあるよ。Jeffery本に。

書いてあるねえ。
これってマジ?
でもあの本に書いてあることで間違ってることってそうそうなさそうだし、
わざわざ書いてあるってのはやっぱりそうなんだよねぇ?
いまいち納得いかないんだが。
0951デフォルトの名無しさん2007/09/24(月) 19:19:20
>>946
えーと?
0952デフォルトの名無しさん2007/09/24(月) 19:37:06
ttp://msdn.microsoft.com/msdnmag/issues/05/10/ConcurrentAffairs/#S2

…
Jefferyダタヨ…
0953デフォルトの名無しさん2007/09/24(月) 20:18:04
>>950
Jeffreyだたな。スマソ。

CLI仕様読んでみたけど、8byte値はnative intと同じアライメントって書いてあるね。
>>952のMSDNマガジンの記事で、
「32bit環境ではlongに対するInterlocked APIはやばい。64bit環境でもお勧めしない」
って書いてあるのは、CLI仕様からすれば確かに納得か。
一応64bit環境なら動くはずだけど適度に恐怖しとけと。

しかしこれStructLayoutでレイアウト指定されたフィールドに対して
Interlocked API使ったりするってパターンでも起きうるな。
コンパイルエラーでも検出できないからやっかいかもね。
0954デフォルトの名無しさん2007/09/24(月) 22:38:48
なに、Interlockedって重いの? なんか意味ねーな
そしてlongじゃ使っちゃいけないの?
どうなってんのよ
0955デフォルトの名無しさん2007/09/24(月) 22:40:28
>>954
重くはないというかむしろ最速。
0956デフォルトの名無しさん2007/09/24(月) 22:48:06
>>952
英語だらけで全部読めなかったけどどう解釈したらいい?
32bitCPUでlongのInterlockedを使うと
1. 実は不可分の処理にならない。
2. 実行時にバウンダリー関係の例外になる。
3. なかでこっそりlockを使っていて実は遅い。
0957デフォルトの名無しさん2007/09/24(月) 22:55:38
なに、32ビット環境だと64ビット変数がおかしな感じで割り当てられることが
あるってことなの?
普通のWindows環境でもダメ?
0958デフォルトの名無しさん2007/09/24(月) 23:07:17
>なに、Interlockedって重いの? なんか意味ねーな

何言ってんの?
重いに決まってるだろう、状況によってかなり違うが。
でもその他の同期機構を使うよりは軽い。

でも競合の無いlockはイメージよりはかなり軽い。
Interlocked2回分レベル。
だからInterlockedを何回も使ってるとlockの方がましということもある。

まあ64ビットで使えないのはちょっとどうかと思うけど。
0959デフォルトの名無しさん2007/09/24(月) 23:23:39
Int32使ってロックして
中でInt64を好きに使ったらいいんじゃないの
0960デフォルトの名無しさん2007/09/24(月) 23:29:10
InterlockedったってCPUが持ってるアトミックな更新命令とかを使うだけだろ
重いわけないんじゃねえの
lockが軽いんだろ
0961デフォルトの名無しさん2007/09/24(月) 23:29:31
そこまでするなら普通にロックするだろ。
めちゃめちゃパフォーマンス重視なら知らんけど。
0962デフォルトの名無しさん2007/09/24(月) 23:31:01
>アトミックな更新命令とかを使うだけだろ

それが重いんだろうがw
0963デフォルトの名無しさん2007/09/24(月) 23:49:31
>>958
てかlockって内部でInterlocked使ってるよ。
0964デフォルトの名無しさん2007/09/25(火) 00:18:40
結論としてはInterlockedなんざいらねえ、lockで十分ということかな
09659382007/09/25(火) 00:50:43
首吊って、あの世逝って修行しなおして来ます。
皆さん来世でお会いしましょう〜。

>>940
なんで?
0966デフォルトの名無しさん2007/09/25(火) 01:23:16
>>947
でもそんなの.NET Frameworkのドキュメントの何処にも書いてねぇ!!
おっぱぴー〜(゚з゚)
0967デフォルトの名無しさん2007/09/25(火) 01:30:31
>>956
3が正解。
64bitマシーンではInt32/Int64とも分割不可な操作が可能。
32bitマシーンではInt32のみ可能でInt64はlockを使っている。
オフセット指定の構造体などでバウンダリーをまたがるケースもlockを行っていると予想できる。
それでMSDNのこの記述。
>したがって、32 ビットのシステムでスレッド セーフにするためには、
>64 ビット値へのすべてのアクセスを Interlocked クラスのメンバを使用して行う必要があります。

ロックを避けるためにInterlockedを使いたいなら、内部でLockが発生しないように注意する必要がある。
0968デフォルトの名無しさん2007/09/25(火) 01:37:09
>それでMSDNのこの記述。
>>したがって、32 ビットのシステムでスレッド セーフにするためには、
>>64 ビット値へのすべてのアクセスを Interlocked クラスのメンバを使用して行う必要があります。

これは別の意味でそっていうかそうとは限らんでそ。
lock使って無くてもそうなるのは当たり前。
0969デフォルトの名無しさん2007/09/25(火) 01:39:42
>>963てかlockって内部でInterlocked使ってるよ。

そうかいてるように見えるのは気のせい?
>でも競合の無いlockはイメージよりはかなり軽い。
>Interlocked2回分レベル。
0970デフォルトの名無しさん2007/09/25(火) 01:42:07
>>965
CLR(2.0)のメモリモデルが意外と強力だから。
0971デフォルトの名無しさん2007/09/25(火) 03:17:36
X86では32bitのCPUでもCMPXCHG8Bなど64bitの値をアトミックに扱う命令はあるが、
活用していないということかな?
0972デフォルトの名無しさん2007/09/25(火) 04:29:36
中途半端な汗の知識で語るな
0973デフォルトの名無しさん2007/09/25(火) 12:02:58
てことはJava5とかで導入されたlock-freeなコレクションみたいなのは
.NETでは最初から作れたんだな
というかもうあるのか?
0974デフォルトの名無しさん2007/09/25(火) 12:18:17
ない。
コンカレントライブラリ確か作成中じゃなかったっけ?
それに含まれたりしないのかなと期待してるんだが…
0975デフォルトの名無しさん2007/09/25(火) 12:44:05
>>974
数年内にSoftware Transactional Memory (STM)使ったライブラリが出てきそうな希ガス
MS ResearchにSTMやってる人がいるから調べてみたら?

ttp://channel9.msdn.com/ShowPost.aspx?PostID=232189
0976デフォルトの名無しさん2007/09/25(火) 13:04:51
スレッドセーフなQueue<T>なんかあったら飛び付くな。
0977デフォルトの名無しさん2007/09/25(火) 13:09:51
Queue.Synchronizedはあるのに、Queue<T>.Synchronizedがないのは何で?手抜き?
0978デフォルトの名無しさん2007/09/25(火) 13:19:13
ttp://research.microsoft.com/research/downloads/Details/6cfc842d-1c16-4739-afaf-edb35f544384/Details.aspx

SMXって実は実行時コード生成のたぐいだったんだな。
0979デフォルトの名無しさん2007/09/25(火) 13:25:36
SMXじゃなくてSXMだった。

あと最新は1.1か。
ttp://www.cs.brown.edu/~mph/
0980デフォルトの名無しさん2007/09/25(火) 13:53:12
シンクロラッパー系はやっぱやめたってことじゃなかったっけ?
0981デフォルトの名無しさん2007/09/25(火) 14:00:42
やめたの?
自分でロックしろってこと?
0982デフォルトの名無しさん2007/09/25(火) 14:37:55
>>969
このあたりか。
http://pc11.2ch.net/test/read.cgi/tech/1187008532/19-
0983デフォルトの名無しさん2007/09/26(水) 02:09:16
もう終わりそうですけど、DataGridViewで滑らかに自動スクロールさせるにはどうしたらいいですか?
FirstDisplayedScrollingRowIndexに値を設定すれば自動でスクロールしてくれるけど、ビシッ!とワープしたように動いちゃいます。
ゆっくりというか、滑らかに次の行へ移動したいんですけど、なんかいい方法あるでしょうか?
よろしくお願いします。
0984デフォルトの名無しさん2007/09/26(水) 06:26:11
1ピクセルずつってことか1行ずつってことかどっちだ
0985デフォルトの名無しさん2007/09/26(水) 10:24:27
ビシッ!っとじゃなくてスゥィーッと動いて欲しいんです
0986デフォルトの名無しさん2007/09/26(水) 10:38:04
滑らかに次の行、だからピクセルじゃね?
985じゃまったくわからんけど
0987デフォルトの名無しさん2007/09/26(水) 11:33:10
>>985 もう少しプログラマー的言葉遣いして繰れ・・・('A`)
0988デフォルトの名無しさん2007/09/26(水) 11:37:53
そして死ぬほど使いにくいリストのスムーズスクロールの二の舞に…
0989デフォルトの名無しさん2007/09/26(水) 15:16:02
>>987
同じく萎えた
09909832007/09/26(水) 18:40:35
まさに
>>985
さんが言ってるような感じなんですが、たとえば
FirstDisplayedScrollingRowIndex++;
だと遷移過程が見えないので、そこをユーザが見えるようにスクロールさせたいということです。
そうするとピクセル単位ということになるんですかね・・・。
ピクセル単位で次の行へスクロールさせるにはどうしたらいいんでしょうか?
DataGridViewのメンバ見ててもどれ使えばいいのかわかりませんでした。
0991デフォルトの名無しさん2007/09/26(水) 18:42:47
ねーよ
0992デフォルトの名無しさん2007/09/26(水) 18:49:12
>>987
案外、985は長嶋茂雄的天才かもしれないじゃないか
0993デフォルトの名無しさん2007/09/26(水) 19:52:05
ヌルっとしたらガッですよ
0994デフォルトの名無しさん2007/09/26(水) 21:08:49
某ツールバーみたいにC#でエクスプローラのツールバーってできるんですか?
C++/CLIとかいうのじゃないと無理なのかなと思うんですが
0995デフォルトの名無しさん2007/09/26(水) 21:10:06
某ツールバーって何だよ。ハゲ
0996デフォルトの名無しさん2007/09/26(水) 21:27:30
>>994
できるかもしれないけどやめとけ。
http://d.hatena.ne.jp/NyaRuRu/20061019/p3
ttp://blogs.wankuma.com/shannon/archive/2007/01/06/54837.aspx
0997デフォルトの名無しさん2007/09/26(水) 22:23:08
なるほど、
シェル拡張コンポーネントをマネージコードで(俺以外のやつは)作るな。
でOkですね。ありがとうございました。
0998デフォルトの名無しさん2007/09/27(木) 07:09:19
 
0999デフォルトの名無しさんNGNG?2BP(100)
1000
1000デフォルトの名無しさん2007/09/27(木) 07:13:42
                               /
          ♪        ,.-r、.        /     一
    r'7ー-..、     _,.,,_    /::::::ヽ!、      ,'   あ  万
   //::::::::::::`ヽ、 ,.:'´:::::::`ヽ/:::::::::::::::::Yi      i   ・   円
   { !::::::::::::::::::::;>'''"´ ̄ `"''<:;::::::::::!」     !   い   と
   }.!:::::::::;ゝ'"´::::::::::::::::::::::::::::::::::::::::ヽ;::::!_!.     |   ・   二
   「/::::::;:':::;::::::::;::::::::::;:::::::;:::::';::::ヽ.:::::::::Y_/     ノ    し  .千
   `ヽ/:::::;':::::/::!:::::::;!::::::ハ::::_!_:::::!::::::!:::!、    /     ・   円
♪   /;'::::::i::::;'::/!-‐/!:::_」 レ'_」_`ハ_レ'::::!:::ヽ. ∠___   て.   く
   /::i:::::::::i::::i/,.'-‐-´   ´  `!__!):::ハ:::::::〉、  i   ・   れ
  ,rく::::ハ;:::/!_;ハ ,.,.     __  ""i::::|::;イ:::';:::/ン'   '、  る.  た
  `'ミ_コ_;ヽi´::!_,i'、    l'´  `; ,.:'!::::!:::!-r'ア´ i    \     ら
    /::::::;'::i::::!:/`iァ.,、..,,__,,. イ::::!::::|/'´「   | l  バン `' 、.,_______
    ;'::::/!::!::::!::::::,.ィ'ヽ、  /ヽ、!::::!:::::;'!  | l l|  人.__
    !::/::::::';|:::::!7´ヽ.ヽ /ム //|:::;!ヽ!_|  /)、    (
    レi:::::::/!::::::!:::::::::V/ ハヘ / レ'_L_ァ'´)' ' ')  Y⌒ ☆ バン
     '、:/ レ、ハ:::::,,..く. - ''"´」二二二二二二二二二二i
     r'",.-/、`ソ´_,,.. - ''"´ |               |
     / '´./i   ソ´       !   これが 素敵な  |
    ;' /;':::ゝイ         |               !
    ! ! i::::::::::';        |     賽 銭 箱   |
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。