C#, C♯, C#相談室 Part42
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/08/26(日) 12:42:25前スレ
C#, C♯, C#相談室 Part41
http://pc11.2ch.net/test/read.cgi/tech/1184840053/
過去スレは>>2-5あたり。
0910デフォルトの名無しさん
2007/09/23(日) 19:34:13struct 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);
}
}
0911910
2007/09/23(日) 19:35:39×myClassObj.中身を中身をいじる(myClassObj);
○MyStruct いじられた結果 = myClassObj.中身を中身をいじる(myStructObj);
0912デフォルトの名無しさん
2007/09/23(日) 20:20:47解決しました本当にありがとうございます(ペコリ
0913デフォルトの名無しさん
2007/09/23(日) 20:21:30(ペコリ
0914デフォルトの名無しさん
2007/09/23(日) 20:57:310915デフォルトの名無しさん
2007/09/23(日) 23:44:15private 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> スレッドが開始した後は、Thread オブジェクトへの参照を保持する必要はありません。
> スレッドは、そのスレッドの処理が完了するまで実行を継続します。
0917デフォルトの名無しさん
2007/09/23(日) 23:58:030918デフォルトの名無しさん
2007/09/24(月) 00:07:31どこかにって・・・
そんないい加減な知識で書いてて怖くないんですか?
0919デフォルトの名無しさん
2007/09/24(月) 00:23:032重にスレッドつくっちゃわないよう監視するとかしないのかい?
0920デフォルトの名無しさん
2007/09/24(月) 00:24:210921デフォルトの名無しさん
2007/09/24(月) 00:26:23別にメインメソッドに対応するThreadオブジェクトを
参照しなきゃって人は居ないんだし、
なんで新しく作ったスレッドだけ怖がるの?
0922デフォルトの名無しさん
2007/09/24(月) 00:29:49何も使うなよもう。
どこかで覚えててうまく動く仕組みになってる、
以上の詳細を知る必要なんてほとんどの場合はないだろ。
0923デフォルトの名無しさん
2007/09/24(月) 00:31:27SSCLI読んでからまたおいで
0924デフォルトの名無しさん
2007/09/24(月) 00:32:53もう失敗って感じだしな
0925デフォルトの名無しさん
2007/09/24(月) 00:40:34あなたはプログラマには向かない、
0926デフォルトの名無しさん
2007/09/24(月) 00:45:440927デフォルトの名無しさん
2007/09/24(月) 01:36:48隠されているものは隠されているから良いのであって、世の中の人間全てが田代じゃないと思うわけだ
0928デフォルトの名無しさん
2007/09/24(月) 01:41:320929919
2007/09/24(月) 01:52:56そりゃ、どんな状況下でスレッド使うことを想定してるんだ?
ボタンのクリックでスレッド開始するってんだろ?
ボタン2度押しされたら?とか考えんのか?
長い処理だと、途中で強制停止させたい。
とかもあるかもだろ。
0930デフォルトの名無しさん
2007/09/24(月) 02:00:330931デフォルトの名無しさん
2007/09/24(月) 02:04:190932デフォルトの名無しさん
2007/09/24(月) 02:22:41どういうイメージしてるか教えてくれんか
0933919
2007/09/24(月) 02:26:42Thread.IsAlive とか Thread.Join とか
することをいってたんだが。
つうか、俺は質問者>>915=918じゃないから
消えるわ。あらしてすまんかった。
0934デフォルトの名無しさん
2007/09/24(月) 04:53:520935デフォルトの名無しさん
2007/09/24(月) 05:02:07Orcasのベータに付いてくるMSDNにはあったと思う。
既にWebのMSDN Onlineに反映されてるかは自分で調べてくれ。
0936デフォルトの名無しさん
2007/09/24(月) 10:19:49ぬぅ、Orcasいれなきゃ駄目ですか・・。
ありがとうございます。
0937デフォルトの名無しさん
2007/09/24(月) 16:07:54契約違反行為しなきゃ分からんこともいっぱいあるのに
ソースやら調べでもアンドキュメントな実装詳細なんてバージョンで変わるかも知れんのに
ご苦労なことだ。
だいたいカレントスレッドの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:580941デフォルトの名無しさん
2007/09/24(月) 16:46:00Threadを自分で覚えとくんだろうからGCなって関係ないし、
自分で覚えとか無いなら使わないんだろうから、
Thread自体がどうだろうがスレッドがきちんと動いてるならどうでもいいし
何が怖いのかわからない。
0942デフォルトの名無しさん
2007/09/24(月) 17:14:13更新スレッドが一つでもあれば参照スレッドにおいても一般に同期は必要。
参照スレッドだけならvolatileも同期機構も不要。
そんな難しいことじゃないんでどういう時にどんな問題が起こりうるか自分で考えてみれ。
0943デフォルトの名無しさん
2007/09/24(月) 17:20:220944デフォルトの名無しさん
2007/09/24(月) 17:23:03それはCの話でC#のvolatileはメモリバリアの意味をちゃんと持ってるよ。
0945デフォルトの名無しさん
2007/09/24(月) 17:48:2564ビットを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:530947デフォルトの名無しさん
2007/09/24(月) 18:05:42CLRがアライメント考慮しないから
Interlockedクラスのlong引数版は使うなって書いてあるよ。Jeffery本に。
64bit値をプロパティにして読み書きを一ヶ所で行うようにして
そこでlockなりなんなりやっておけば良さそうな気はするけどね。
負荷はどうでもよくて、そうしておいた方が
あとでリファクタリングしやすそうという程度の理由だけど。
個人的にはファイル情報なんか見に行ってファイルアクセスが発生したときの
何百万クロック単位のブロックの方が気になるかな。
0948デフォルトの名無しさん
2007/09/24(月) 18:30:24その何百万クロックを防ぐために二重チェックするという話なのでは。
と一応つっこんでおく。本題とはあまり関係ないけど。
0949デフォルトの名無しさん
2007/09/24(月) 18:32:03C# なんだし、FileSystemWatcher 使えば?
0950デフォルトの名無しさん
2007/09/24(月) 19:16:58>CLRがアライメント考慮しないから
>Interlockedクラスのlong引数版は使うなって書いてあるよ。Jeffery本に。
書いてあるねえ。
これってマジ?
でもあの本に書いてあることで間違ってることってそうそうなさそうだし、
わざわざ書いてあるってのはやっぱりそうなんだよねぇ?
いまいち納得いかないんだが。
0951デフォルトの名無しさん
2007/09/24(月) 19:19:20えーと?
0952デフォルトの名無しさん
2007/09/24(月) 19:37:06…
Jefferyダタヨ…
0953デフォルトの名無しさん
2007/09/24(月) 20:18:04Jeffreyだたな。スマソ。
CLI仕様読んでみたけど、8byte値はnative intと同じアライメントって書いてあるね。
>>952のMSDNマガジンの記事で、
「32bit環境ではlongに対するInterlocked APIはやばい。64bit環境でもお勧めしない」
って書いてあるのは、CLI仕様からすれば確かに納得か。
一応64bit環境なら動くはずだけど適度に恐怖しとけと。
しかしこれStructLayoutでレイアウト指定されたフィールドに対して
Interlocked API使ったりするってパターンでも起きうるな。
コンパイルエラーでも検出できないからやっかいかもね。
0954デフォルトの名無しさん
2007/09/24(月) 22:38:48そしてlongじゃ使っちゃいけないの?
どうなってんのよ
0955デフォルトの名無しさん
2007/09/24(月) 22:40:28重くはないというかむしろ最速。
0956デフォルトの名無しさん
2007/09/24(月) 22:48:06英語だらけで全部読めなかったけどどう解釈したらいい?
32bitCPUでlongのInterlockedを使うと
1. 実は不可分の処理にならない。
2. 実行時にバウンダリー関係の例外になる。
3. なかでこっそりlockを使っていて実は遅い。
0957デフォルトの名無しさん
2007/09/24(月) 22:55:38あるってことなの?
普通のWindows環境でもダメ?
0958デフォルトの名無しさん
2007/09/24(月) 23:07:17何言ってんの?
重いに決まってるだろう、状況によってかなり違うが。
でもその他の同期機構を使うよりは軽い。
でも競合の無いlockはイメージよりはかなり軽い。
Interlocked2回分レベル。
だからInterlockedを何回も使ってるとlockの方がましということもある。
まあ64ビットで使えないのはちょっとどうかと思うけど。
0959デフォルトの名無しさん
2007/09/24(月) 23:23:39中でInt64を好きに使ったらいいんじゃないの
0960デフォルトの名無しさん
2007/09/24(月) 23:29:10重いわけないんじゃねえの
lockが軽いんだろ
0961デフォルトの名無しさん
2007/09/24(月) 23:29:31めちゃめちゃパフォーマンス重視なら知らんけど。
0962デフォルトの名無しさん
2007/09/24(月) 23:31:01それが重いんだろうがw
0963デフォルトの名無しさん
2007/09/24(月) 23:49:31てかlockって内部でInterlocked使ってるよ。
0964デフォルトの名無しさん
2007/09/25(火) 00:18:400966デフォルトの名無しさん
2007/09/25(火) 01:23:16でもそんなの.NET Frameworkのドキュメントの何処にも書いてねぇ!!
おっぱぴー〜(゚з゚)
0967デフォルトの名無しさん
2007/09/25(火) 01:30:313が正解。
64bitマシーンではInt32/Int64とも分割不可な操作が可能。
32bitマシーンではInt32のみ可能でInt64はlockを使っている。
オフセット指定の構造体などでバウンダリーをまたがるケースもlockを行っていると予想できる。
それでMSDNのこの記述。
>したがって、32 ビットのシステムでスレッド セーフにするためには、
>64 ビット値へのすべてのアクセスを Interlocked クラスのメンバを使用して行う必要があります。
ロックを避けるためにInterlockedを使いたいなら、内部でLockが発生しないように注意する必要がある。
0968デフォルトの名無しさん
2007/09/25(火) 01:37:09>>したがって、32 ビットのシステムでスレッド セーフにするためには、
>>64 ビット値へのすべてのアクセスを Interlocked クラスのメンバを使用して行う必要があります。
これは別の意味でそっていうかそうとは限らんでそ。
lock使って無くてもそうなるのは当たり前。
0969デフォルトの名無しさん
2007/09/25(火) 01:39:42そうかいてるように見えるのは気のせい?
>でも競合の無いlockはイメージよりはかなり軽い。
>Interlocked2回分レベル。
0970デフォルトの名無しさん
2007/09/25(火) 01:42:07CLR(2.0)のメモリモデルが意外と強力だから。
0971デフォルトの名無しさん
2007/09/25(火) 03:17:36活用していないということかな?
0972デフォルトの名無しさん
2007/09/25(火) 04:29:360973デフォルトの名無しさん
2007/09/25(火) 12:02:58.NETでは最初から作れたんだな
というかもうあるのか?
0974デフォルトの名無しさん
2007/09/25(火) 12:18:17コンカレントライブラリ確か作成中じゃなかったっけ?
それに含まれたりしないのかなと期待してるんだが…
0975デフォルトの名無しさん
2007/09/25(火) 12:44:05数年内にSoftware Transactional Memory (STM)使ったライブラリが出てきそうな希ガス
MS ResearchにSTMやってる人がいるから調べてみたら?
ttp://channel9.msdn.com/ShowPost.aspx?PostID=232189
0976デフォルトの名無しさん
2007/09/25(火) 13:04:510977デフォルトの名無しさん
2007/09/25(火) 13:09:510978デフォルトの名無しさん
2007/09/25(火) 13:19:13SMXって実は実行時コード生成のたぐいだったんだな。
0979デフォルトの名無しさん
2007/09/25(火) 13:25:36あと最新は1.1か。
ttp://www.cs.brown.edu/~mph/
0980デフォルトの名無しさん
2007/09/25(火) 13:53:120981デフォルトの名無しさん
2007/09/25(火) 14:00:42自分でロックしろってこと?
0982デフォルトの名無しさん
2007/09/25(火) 14:37:55このあたりか。
http://pc11.2ch.net/test/read.cgi/tech/1187008532/19-
0983デフォルトの名無しさん
2007/09/26(水) 02:09:16FirstDisplayedScrollingRowIndexに値を設定すれば自動でスクロールしてくれるけど、ビシッ!とワープしたように動いちゃいます。
ゆっくりというか、滑らかに次の行へ移動したいんですけど、なんかいい方法あるでしょうか?
よろしくお願いします。
0984デフォルトの名無しさん
2007/09/26(水) 06:26:110985デフォルトの名無しさん
2007/09/26(水) 10:24:270986デフォルトの名無しさん
2007/09/26(水) 10:38:04985じゃまったくわからんけど
0987デフォルトの名無しさん
2007/09/26(水) 11:33:100988デフォルトの名無しさん
2007/09/26(水) 11:37:530989デフォルトの名無しさん
2007/09/26(水) 15:16:02同じく萎えた
0990983
2007/09/26(水) 18:40:35>>985
さんが言ってるような感じなんですが、たとえば
FirstDisplayedScrollingRowIndex++;
だと遷移過程が見えないので、そこをユーザが見えるようにスクロールさせたいということです。
そうするとピクセル単位ということになるんですかね・・・。
ピクセル単位で次の行へスクロールさせるにはどうしたらいいんでしょうか?
DataGridViewのメンバ見ててもどれ使えばいいのかわかりませんでした。
0991デフォルトの名無しさん
2007/09/26(水) 18:42:470992デフォルトの名無しさん
2007/09/26(水) 18:49:12案外、985は長嶋茂雄的天才かもしれないじゃないか
0993デフォルトの名無しさん
2007/09/26(水) 19:52:050994デフォルトの名無しさん
2007/09/26(水) 21:08:49C++/CLIとかいうのじゃないと無理なのかなと思うんですが
0995デフォルトの名無しさん
2007/09/26(水) 21:10:060996デフォルトの名無しさん
2007/09/26(水) 21:27:30できるかもしれないけどやめとけ。
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:191000デフォルトの名無しさん
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::::::::::'; | 賽 銭 箱 |
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。