[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/27 07:18 / Filesize : 229 KB / Number-of Response : 925
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C#, C♯, C#相談室 Part52



1 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 10:15:52 ]
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C#, C♯, C#相談室 Part51
pc12.2ch.net/test/read.cgi/tech/1233757615/

Visual C# 2008 Express Edition 日本語版
www.microsoft.com/japan/msdn/vstudio/express/vcsharp/

その他テンプレ>>2-5くらい

11 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:22:02 ]
GetNodeCount

12 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:28:39 ]
>>8
こいつはろくなコード書けないんだろうな

13 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 01:33:13 ]
ID出ない板で荒らし、かっこいいです

14 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 07:42:58 ]
>>635
英語ドキュメントを読むコツは、最初は辞書を引かない事
高卒レベルの英語で、おおまかな部分は読める
一度通して読んだあと、大体ネックになる重要単語が見えてくるはずだから、
その時辞書を引いて調べればいい
英語が苦手っていう奴は英語をすべて日本語に訳してから理解しようとしている
英語は英語として理解するのが簡単

15 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 09:07:42 ]
>>11
どもでした! 

16 名前:デフォルトの名無しさん [2009/04/02(木) 15:37:51 ]

★「完全無所属」実は「自民支部長」…千葉知事当選の森田氏
tsushima.2ch.net/test/read.cgi/newsplus/1238600250/

・千葉県知事選で100万票余を獲得して初当選した元衆院議員の森田健作氏(59)が、
 現在も東京都の自民党支部長を務めていたことがわかった。

 森田氏は、政党と距離を置く「完全無所属」をアピールして無党派層の支持を集めており、
 一夜明けた30日の記者会見で「近く支部を解散したい」との考えを明らかにした。
 
 森田氏が支部長を務めるのは、自民党東京都衆議院選挙区第2支部(東京都中央区)。
 森田氏が参院議員だった1995年1月に設立された。衆院議員に転じた森田氏が2003年
 10月に辞めた後も、支部は存続している。

 収支報告書によると、支部長の登録は本名の「鈴木栄治」。04〜07年には計1億6185万円の
 企業・団体献金を受け、同時期に計1億5030万円を、同支部と同じ事務所で、森田氏が代表を
 務める資金管理団体「森田健作政経懇話会」に寄付していた。

 使途については、「知事選には使っていない。知事選に無所属での出馬を決意する前に、
 自民党候補の応援などのために使った」と釈明した。
 www.yomiuri.co.jp/politics/news/20090330-OYT1T00515.htm



17 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 16:30:20 ]
>>16
朝日新聞の中の人ですか、携帯からご苦労様です。早くアク禁解除されるといいですね。

18 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 02:38:58 ]
k個あってn角形の3次元配列を作成していまして
現在ファイルから配列に格納するところで躓いています。
図形1=X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5.....................  
図形2=.....
これを[図形][座標点][X,Y]という形に格納する形式です List_POS[0][1][0]で例外が出てしまいます
どうしたらいいのでしょうか? ジャグ配列なら実現できたのですがListにしてワーカースレッドから動的に追加もしたいので

int a=0,b=0,c=0;
int line_count = arrText.Count;
public List<int[]>[] List_POS = new List<int[]>[line_count];//第一要素を可変長にしたい
for (int i = 0; i < List_POS.Length; i++)
   List_POS[i] = new List<int[]>(new int[][] { new int[2] });
foreach (string sOutput in arrText){// 一行ずつ読み込んで,各行をsplitメソッドで分ける
    string temp = (string)arrText[a]; // string型にキャスト
    string[] temp2 = temp.Split(',');// splitメソッドで文字列アレイにして数える
    int col_count = temp2.Length; // 列数を数えているだけ
    string[] temp_line = sOutput.Split(',');
    for(int i=0;i<temp_line.Length;i++){
for(int k=0;k<2;k++){
   i = i + k;
   List_POS[a][b][c]=Convert.ToInt32(temp_line[i]);
   c++;
}
c = 0;
b++;
    }
    b = 0;
    a++;
}

19 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 02:42:58 ]
List<int[][]>にすればいいんじゃない?
int[][]をオブジェクトにしてもいいような気もする



20 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 04:40:03 ]
>>18
List_POS[0][0] しか作ってないのに、List_POS[0][1] にアクセスしたら
当然例外になるわな

> 第一要素を可変長にしたい
はずなのに二番目を List にしてるのは何で? (多分、>>19と同じ)
図形数を可変にするんじゃないの?

あと、要素(element)ってコレクションの中身のことだから

21 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 13:49:36 ]
いろいろ混乱してとりあえず 整理のためにこんな感じなのかなとコードを書いてみます
 
public List<int[][]> List_POS;
int a=0,b=0,c=0;
int line_count = arrText.Count;
List_POS; = new List<int[][]>();
foreach (string sOutput in arrText){
     string temp = (string)arrText[a]; // string型にキャスト
     string[] temp2 = temp.Split(',');// splitメソッドで文字列アレイにして数える
     int col_count = temp2.Length; // 列数を数えているだけ
     List_POS[a] = new List<int[][]>(col_count/2);//XYで2つ使うため一行を2で割る
     string[] temp_line = sOutput.Split(',');
     for(int i=0;i<temp_line.Length;i++){
        List_POS[a][b]=new List<int[][]>(2);
        for(int k=0;k<2;k++){
          i = i + k;
          List_POS[a][b][c]=Convert.ToInt32(temp_line[i]);
.....



22 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 13:55:45 ]
なんつーキモキモ変数名


23 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 18:03:01 ]
public List<int[][]> List_POS;
List_POS[a] = new List<int[][]>(col_count/2);

こんなんコンパイル通らないでしょ
List_POSに入るのがList<int[][]>
List_POS[a]に入るのはint[][]
List_POS[a][b]に入るのはint[]だよ

24 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 18:21:31 ]
0xEDB88320 ^ 0
の演算結果が
0xEDB88320
となるのはなぜ?
VB.NETだと1になるんだけど

25 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 18:32:47 ]
なぜも何も普通だろ。
VBのほうが謎だ。

26 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 18:38:14 ]
>>24-25
VBの^は冪乗、C#の^はビット毎の排他的論理和。

27 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 19:02:40 ]
>>26
そうでしたか、ありがとう。

28 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:15:19 ]
>>23 なるほど
rcm.List_POS.Add(new int[col_count / 2][]);
rcm.List_POS[a][b]=new int[2];
こういう風に修正したら通りました
二行目もできるかどうか試してみます。

29 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 09:56:34 ]
>>28
あんたさ、もっと読みやすさを心がけてかいてよ
せっかくオブジェクト指向言語使ってんだからさ
このプログラムを保守するはめになったやつのことも考えようぜ



30 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 10:35:07 ]
3次元配列ってところがダメだよな。
図形クラス作るのが普通じゃね?

31 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:36:19 ]
コードの読み易い、読み難いってのは
オブジェクト指向関係ないと思うよ
OO厨なら仕方ないが

32 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:10:16 ]
同意

33 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:19:04 ]
なんで関係ないのかと
オブジェクト指向のパッケージ化だけ考えても
データと振る舞いを結び付け、可読性を向上してるだろ
納得できる理由を書いてみろ

34 名前:デフォルトの名無しさん [2009/04/05(日) 13:26:25 ]
・継承によるコードの隠蔽,初期化の順番の制約がわけわからんになりやすい
・再利用を謳っているために,同じ"ような"コードがあるか探さないといけない.
 それを怠ると車輪の再発明の連続
・目的のために様々な手段が用意されすぎている
>>33みたいな奴がOOPLすごいよ!クラスで設計図が継承で再利用!しかも大規模開発に剥いているよ!
 って幻想を吹き込んでくる

35 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:28:03 ]
>>33
OOはパラダイムなので「可読性の向上」まではどう考えても含んでいない
なのに>>33が可読性の向上とか言い出している辺りが幻想,ね

36 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:45:57 ]
OO=可読性の向上ではないが、>>21のコードが見難く、保守のし難いコードであるのは事実。

37 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 16:55:47 ]
複数台マシンがあって、使用メモリが少ない方で処理を行うようにしたいのですが、
他のマシンの利用可能メモリなどを取得したいのですが、
どのようにしてとればいいのか、教えてくだされ(;´д⊂)

Processなら、 Process.GetProcessesとかでとれるんですが。。。

38 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:02:07 ]
>>37
なんかずいぶん無茶なこと言ってるぞ。
アプリケーションが自前でロードバランスするのか。
もちろん実験ならいいんだけど、背景は何?

39 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:11:08 ]
>>37
何がやりたいのかさっぱりわからんけど
各々のマシンで動かすアプリがそれぞれのメモリ残量を返すようにすればいいんじゃねーの?



40 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:18:47 ]
まずはOOじゃなくて構造化プログラミングをば

41 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:09:50 ]
その前に2chを卒業

42 名前:37 mailto:sage [2009/04/05(日) 18:13:52 ]
>>38,39

ええっと、説明不足でした^^;

分散処理をしたくて、
本マシンから、重い処理だけを社内LANネットワークにつながった他のマシンで処理させる感じです。

で、その他のマシンっていうのが複数台あり、パフォーマンスに余裕があるものを選択するというものでした。
LANにつながった他のマシンの現在のメモリ使用量などを調べる方法があったら欲しいとおもったのです。

さすがにむりなのかな?^^;

43 名前:デフォルトの名無しさん [2009/04/05(日) 18:15:35 ]
>40

構造化で思い出したんです。↓

plaza.rakuten.co.jp/u008expert/

そう言えば二次元のGenericリストとか、
var gl0 = new List<List<int>>();

その他、色々と複雑なデータ構造を簡単に作れます。↓

var gl1 = new List<Dictionary<string,int>>();
var gl2 = new Dictionary<string, List<string>>();
var gl3 = new SortedDictionary<string,
SortedDictionary<string, List<int>>>();

なんで本とかで、あまり紹介されないのでしょうかねぇ。
(・・?

メモリを無茶苦茶食うとか…
スピードがえらく遅いとか…

C#を使う人はLispのような入れ子構造が嫌いとかぁ?^m^

何がネックになっているのでしょうか
ご存知の方は教えて下さい。m(__)m

44 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:18:37 ]
宣伝乙

45 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:22:07 ]
誰でも知ってるから。

46 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:33:31 ]
そんな取り回しの悪い複雑なものを作って喜んでるのは初心者くらいなもの
誇らしげに言うようなことじゃない

47 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:36:35 ]
これはどう見ても釣り
ttp://plaza.rakuten.co.jp/u008expert/
こいつに悪意をもつものの仕業に違いない

48 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:54:37 ]
何処に書けばいいのか分からんかったんだけど、
DirectoryEntry使ってiPlanetのディレクトリ更新しようとしていて
ユーザーとかのプロパティを見る参照は上手くいくんだが
プロパティ変更してCommitChanges呼ぶとエラーになる。

ADだと上手くいくんだけど、iPlanetが特殊なんかな。それとも
DirectoryEntryがPureなLDAP話さないでAD固有な話し方してるからかな。

49 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:11:48 ]
>>43
当たり前のことすぎて触れることじゃない。



50 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:13:09 ]
>>42
#1 > LANにつながった他のマシンの現在のメモリ使用量などを調べる方法
#2 WANにつながった他のマシンの現在のメモリ使用量などを調べる方法
#3 近所につながった他のマシンの現在のメモリ使用量などを調べる方法
そんな複雑なケースに対応するようにAPIが提供されているわけではありません

というわけで,マシンの現在のメモリ使用量(?????どんなの想像してる?シングルプロセス,シングルコアなマシンでの使用量?)を取得する
のと,TCP/IPかなんか使って通信するものを組み合わせればいいんでねーの?

51 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:13:55 ]
Dictionary<string,int>をラップして分かりやすいクラスにして
さらにList<MyClass>にした方がいいことが多いから
List<Dictionary<string,int>>は使われない

52 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:14:17 ]
>>43
むしろ"abc"[0]とか,トリッキーなコードになってしまうような気がする

53 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:33:08 ]
>>50
各PCでそういうサービスを立ち上げておけばOKだね

54 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:55:29 ]
というわけでWMIでリモートのPC参照すれば可能かも
d.hatena.ne.jp/seki-moto/20081014/wmi2

55 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 08:03:03 ]
C#の本の質問もここでいいのかな?

ある程度C#についてオブジェクト指向とか綺麗なコードの書き方含めて載ってる本ないですか?
独習C#か、プログラミングC#がそれっぽい雰囲気出てたんだけど……。
洋書でも可です。

56 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 08:33:42 ]
>>55
アマゾンカテゴリランキングの1〜100位探してみろよ

57 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 09:18:36 ]
身も蓋もないなw
まああっちはレビューも書いてあるしなあ。

58 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 09:56:42 ]
>>56-57
サンクス。
C#クイックブックもよさげかな……。
今度本屋で見て見よう。

59 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 10:05:29 ]
レビューはあんまあてにならないだろw



60 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 10:36:11 ]
ここでの評価もあてにならんからどっこいどっこいだ
うまく本の当り掴めるようになりたいもんだ・・・技術書安くないもんなあ

61 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 10:37:29 ]
図書館おいしいです

62 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 12:17:17 ]
洋書でいいなら、googleやSafariで立ち読みすればいい。

63 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 12:36:24 ]
もちろん、座って読んでもOKだ

64 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:34:28 ]
だがうんこ座りはご遠慮いただきたく。

65 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 15:26:55 ]
例えばLabelを継承した独自のカスタムコントロールで
継承元のTextAlignとかを使う側に見せないようにするとかは簡単に出来ますか?

Internalとかで上書きしてやればできそうだけど、なんかスマートでない気がするし・・・
継承という以上仕方がないとは思っていますが


66 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 15:38:44 ]
なんで機能を継承してるのに隠蔽する必要があるの?
っていう話に落ち着くぜ

67 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 16:08:04 ]
そういう場合って継承するんじゃなくインスタンスをプライベートに持って
アクセサを作るのが普通なんじゃない?
#言語仕様とは別のデザパタのdelegationって奴になるのか?

継承してるのに使えないとかはOOの性質上無理だと思うけど。


68 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 16:11:45 ]
>>66
>>67
ですよね
今作られている既存のカスタムコントロールがそう作られていて大きく変えないようにするにはどうかなと考えていたんですが・・
おとなしく新しく作り直してそっちに変更するように要望をかけるとします。

69 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 17:12:19 ]
TextAlignは見えるけど,機能上使えない,っていう特殊化ならアリ



70 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 17:34:53 ]
継承はis aの関係が基本で、決してカスタマイズ/再利用じゃないからね。
継承元で出来る事が継承先で出来なくなるのは有り得ない。

71 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 17:35:33 ]
既存のコントロールを内包してるけど、
別物として扱いたいってことか。
セットされた値を何かしらの方法で計算して表示するコントロールでほとんどラベルなんだけど、
表示されてるテキストは直接書き換えはさせたくないみたいな。


72 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 17:39:20 ]
ググったら似たような質問あったよ
件名:[C#]コントロールのプロパティ固定(継承)
www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42032&forum=7
セッターを空のメソッドでオーバーライドして殺してるみたい。

質問の内容自体に対する評価はここと似たようなもんだな。

73 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 17:43:11 ]
youtubeとかニコニコの動画のダウンロードってどうやるの?

74 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 17:54:04 ]
一度言ってみたかった・・・
「ググれカス」

75 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:16:56 ]
>>55
洋書でいいなら、中国語でいい本がある

76 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:18:01 ]
グぐってきました・・・で、動画のurlの特定ってどうやるんですか?

77 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:23:40 ]
>>76
  。     。
    。  。 。 。 ゚
   。  。゚。゜。 ゚。 。
  /  // / /
 ( Д ) Д)Д))

78 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:29:53 ]
C#に特定した話じゃないなあそれ

79 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:35:29 ]
・・・もういいです・・・使えない人たちですね



80 名前:73 mailto:sage [2009/04/06(月) 18:39:47 ]
>79
これ誰だよw

C#じゃないみたいなんで、他所のスレ探します

81 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:43:39 ]
取り敢えず公式見てこいよ。
「正当な」方法でどうやって情報取得するかきっちり書いてあるんだから。

82 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:44:58 ]
公式はどこにあるのですか?
教えて下さい

83 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:48:53 ]
そりゃニコニコやyoutubeのトップから辿れよ

84 名前:73 mailto:sage [2009/04/06(月) 18:53:18 ]
>>81
ありがとう調べてみます

>>82
だから誰だよww

85 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:58:28 ]
>>75
中国無理っす

86 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:00:20 ]
>>80,84
いい加減にしてください・・・誰なんですか・・・

87 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:07:16 ]
これが無職いたのよいところ

88 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:16:56 ]
ここまで全部俺の(ry

89 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:22:05 ]
もう私のために争うのはやめて!



90 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:29:15 ]
WebBrowser Controlでの質問です

ttp://domworld.cool.ne.jp/mst/index.cgi?mode=mstinit
↑のページを完全に読み込みたいんですが、javascript?のところで途中で止まってしまいます

MessageBox.Show( webBrowser.Document.GetElementsByTagName( "html" )[0].OuterHtml );
でHTMLを表示してもソースと違っていてどうにもなりません
対処法があれば教えてください

あとソースとwebBrowserのhtmlが違う理由をわかる方いたら併せてお願いします

91 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:07:24 ]
違っていてってどう違ってるのかぐらい教えてくれよ。
User-Agentあたり見て出力内容わけてたりしてな。

92 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:13:43 ]
>>90
ううむ。折れんところで試してみたが、一応完全に?読めたけど。

93 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:15:57 ]
>>90
> ソースとwebBrowserのhtmlが違う理由
ブラウザがパースしたDOMをテキスト表現にしているからだとおも

94 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:54:33 ]
>>91-93さん
レスありがとうございます

WebBrowser.Document.All.GetElementsByName("id")[0].SetAttribute( "Value", "name" );
のように入力してログインまで持って行きたいんですが

>>92
正確ではありませんでした
すみません

DOM解析済みのHTMLでFrameを取りに行ってるみたいなんで無理みたいですorz

WebBrowserコントロールからフレームを利用したのページのHTMLソース取得方法
ttp://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/41e23caf-05d6-4dff-b5a1-9b1ecb12b4ed/

95 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:15:40 ]
>>94
がんばればできる。

96 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:17:00 ]
現在大体100μs単位で動くタイマーを作成しているのですが、別スレッドからControl.BeginInvokeでコントロールを
操作する際に、そこでApplication.DoEvensを実行すると、コントロールが壊れる?みたいなのですが、なぜでしょうか?

具体的にいうと、別スレッドでビジーループを回して待機していたタイマーからイベントが飛び、Control.BeginInvokeで
メインスレッドにて登録されたデリゲートを実行するようになっており、デリゲート内にApplication.DoEventsがあると、
別ウインドウで操作していたHScrollBarが壊れ、Dock.FillしていたはずのコントロールがHScrollBar部分をドラッグ
することによりリサイズできてしまう、という具合です。

サンプルプロジェクト:
ttp://www1.axfc.net/uploader/He/so/214358
pass: invoke

サンプルプロジェクトのProcessingWindowのStartボタンをクリックした後、ControlWindowのスクロールバー右を
連打するとスクロールバーが壊れます。

一応メインスレッド上でタイマーのビジーループを回すか、Application.DoEventsを取り除くことにより回避できますが、
前者だと何もしてなくてもCPUを食ってしまうし、後者だと重い処理を行っているときにUIの更新ができなくなってしまう
のでできれば別スレッドからBeginInvokeしたときにApplication.DoEventsを実行したいのですが…

97 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 16:04:51 ]
とりあえず俺の環境では起きないんだが

98 名前:96 mailto:sage [2009/04/08(水) 17:32:32 ]
>>97
こちらでは、スクロールバーの右の矢印部分を連打(結構なスピードで)すると簡単に発生するのですが…
スクロールバーの描画が破綻した後、右矢印部分になぜか点々(サイズ変更可能なウインドウに表示されてたり
するアレ)が表示されます。
こうなると、スクロールバーは完全に機能しなくなり、スクロールバーのあった部分は再描画が無効になります。

99 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:07:52 ]
>>98
俺も結構な速度でやってみたんだけどな
それこそクリックしたら画面の女の子脱ぎますよと言われたくらいの速度でw
ほぼ同じ環境の後輩に同じことやらしてみたけど症状が出てない


一応環境
VISTA BUSINESS SP1(エアロ有効)
VS2008 Professional上でデバッグ実行





100 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:23:43 ]
>>97のPCで問題を再現するには超人的なスピードでの連打が必要なんだよ、きっと。

>>98
こういうケースでは、スリープを追加するなどして
"連打" ではなく、一回のクリックで問題を再現させることを目指すと、原因がわかったりするよ。

例えば、DoEvents()の後にThread.Sleep(100);と書き、スクロールバーを右クリックしてみるといい。
運良くこっちと似た環境ならば、100%の確率でスタックオーバーフローするので
スタックトレースを見れば原因がわかるはず。

101 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:25:08 ]
>>98
ディスプレイドライバのせいだったりして
ハードウェアアクセラレータ無効にすると治るとかない?

102 名前:96 mailto:sage [2009/04/08(水) 18:44:52 ]
>>99
こちらでは速めのダブルクリック程度の速度でも発生するのですが…
こちらの環境は
Geforce 9600GT 512MB
XP 32bit
VS2008 Pro
です。

>>100
スタックオーバーフローするのは、BeginInvoke内でdoEventがtrueになる前に何度もBegineInvokeが
実行されてしまうのが原因でした。これについては、Invokeの前にdoEventをtrueにすることにより解決できましたが、
スクロールバーが壊れるのとは別問題のようです。

>>101
ハードウェアアクセラレータは切ってみましたが、特に関係があるわけではないようです。
ドライバも最新のものにしてみましたが、改善しませんでした。

103 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 20:38:21 ]
ほんとだうちの環境でも壊れたぞ。

104 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:12:13 ]
>>102
うーん。自分の環境だと再現しないので勘になっちゃうけど。

DoEvents でもたぶん BeginInvoke なキューを処理する気がするから
このコードだと一度間に合わなくなればそれより優先度の低いメッセージは
まったく処理されなくなる希ガス

あとそもそも精度 100μs なんて無理って話は突っ込んでおいたほうが
いいのかな

105 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:35:32 ]
>>96
環境によって差が出てるということは、
Control.BeginInvokeの発行間隔が処理時間より短いせいだと思う。
前の処理が終わらないうちに次のBeginInvokeが実行されないようにするか、
同期型のControl.Invokeにする。
あとはDoEventではなくpictureBox1.Updateを使うべきだろう。


106 名前:96 mailto:sage [2009/04/08(水) 22:10:18 ]
>>104,105
それだと、タイマーのインターバルをゆっくりにすれば発生しないはずですが、それでも発生しますし、
インターバルが短くても、Application.DoEventsを取り除くと発生しなくなります。
また、フラグを立てて(バグってたけど)同時に何度もBeginInvokeされないようにはしているので、
>>102の通り、別問題な気がします。

>>104
>>100μsなんて無理
確かに精度はよくないのですが、実際に使うときには最短で200μs程度のインターバルで使用するので、
その間隔で使用する分には何とか使用できる程度の精度は出るようです。

>>105
このサンプルでは、画面の更新しかしていないためそれでもいいのですが、実際はボタン操作や
テキスト操作なども反映させるため、Application.DoEventsを使いたいのです。

107 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:29:01 ]
DoEventsでやらずに、ピクチャーボックスのInvalidateメソッドを実行し、
描画はImageプロパティは使用せずに、Paintイベントで描画するようにすれば?
GraphicsオブジェクトはPaintイベントの引数eにe.Graphicsがあるからこれを使用して描画する

108 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:31:40 ]
テキスト操作も更新するときはそいつのInvaridateを実行。
DoEventsはプロセスすべてのイベントを処理するから重いんだよ。

109 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:03:36 ]
μsはmsの間違いだと思う。



110 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:34:43 ]
排他とかInvalidateでの再描画とかいくつか考慮は必要なのだが、
この方法でいけるはず。
基本はControl.InvokeもApplication.DoEventsも使わないことだな。

if (!abort)
{
   //c.BeginInvoke(busyMethod);
   Tick(this, EventArgs.Empty);
}

//pictureBox1.Image = image;
using (Graphics g = pictureBox1.CreateGraphics())
{
   g.DrawImage(image, 0, 0);
}

Draw(count);
count++;
//Application.DoEvents();


111 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:08:41 ]
>>96
なんか分かってるのか分かってないのかよく分からんコードだな、というのが率直な感想。
なぜそうしているのか理由や必然性がわからない部分が多すぎる。
ちょっとVB上がりのコピペプログラマの臭いがする。

つーか、せいぜい70hzでしか更新されない画面をusオーダーで更新して(そもそも不可能だけど)
なんか意味あるのかなw






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<229KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef