C#, C♯, C#相談室 P ..
[2ch|▼Menu]
2:デフォルトの名無しさん
09/04/01 10:16:30
関連スレ

ふらっとC#,C♯,C#(初心者用) Part39
スレリンク(tech板)

Visual Studio 2008 Part 15
スレリンク(tech板)

WPF(XAML,XBAP,.NET3.5)GUIプログラミング Part3
スレリンク(tech板)

【VB.NET】LINQ友の会【C#, C♯, C#】
スレリンク(tech板)

C#,C#の宿題片付けます。
スレリンク(tech板)

3:デフォルトの名無しさん
09/04/01 10:16:47
参考リンク

MSDNライブラリ
URLリンク(msdn.microsoft.com)

@IT Insider.NET
URLリンク(www.atmarkit.co.jp)
Insider.NET 会議室 ディレクトリ
URLリンク(www.atmarkit.co.jp)
MSDN フォーラム
URLリンク(forums.microsoft.com)

pinvoke.net: the interop wiki!
URLリンク(pinvoke.net)
宇宙仮面の C# プログラミング / C# Programming
URLリンク(ukamen.hp.infoseek.co.jp)
WisdomSoft C#入門
URLリンク(wisdom.sakura.ne.jp)
WisdomSoft Microsoft .NET入門
URLリンク(wisdom.sakura.ne.jp)
どっとねっとふぁん
URLリンク(dotnetfan.org)
緑のバイク 初めてのC# 〜 覚え書き 〜
URLリンク(homepage3.nifty.com)
どぼん!の .NET Tips
URLリンク(dobon.net)

4:デフォルトの名無しさん
09/04/01 10:17:03
質問する前に"必ず"WikiやFAQ集を参照し、同じような質問がないか確認してください。

初歩的な質問はPC初心者板で・・・
URLリンク(pc11.2ch.net)
参考リンク(よく出てくる情報リンク)
Windows Vista Wiki
URLリンク(windowsvista.ms)
Windows VistaFAQ
URLリンク(vistafaq.stdo.net)
インストールから設定・活用まで〜 すべてが分かるWindows Vista大百科
URLリンク(journal.mycom.co.jp)

5:デフォルトの名無しさん
09/04/01 13:37:14
1おつ

6:デフォルトの名無しさん
09/04/01 14:12:43
乙です。

C#3.0対応のデザインパターンの解説書かサイトで、
日本語で書かれているのってないですかね?

英語なら、オライリーからC#3.0のデザインパターン本が出てたのですが。

7:デフォルトの名無しさん
09/04/01 14:23:36
>>1

8:デフォルトの名無しさん
09/04/01 19:29:46
誘導くらいしろよはげ
死ぬの?

9:デフォルトの名無しさん
09/04/01 19:32:36
>8
ひどいフシアナ

10:デフォルトの名無しさん
09/04/01 20:02:02
TreeView で現在選択されているのが、最下段ノードであるかどうかを取得するには
どういう方法が一番よいでしょう?

11:デフォルトの名無しさん
09/04/01 20:22:02
GetNodeCount

12:デフォルトの名無しさん
09/04/02 00:28:39
>>8
こいつはろくなコード書けないんだろうな

13:デフォルトの名無しさん
09/04/02 01:33:13
ID出ない板で荒らし、かっこいいです

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

15:デフォルトの名無しさん
09/04/02 09:07:42
>>11
どもでした! 

16:デフォルトの名無しさん
09/04/02 15:37:51

★「完全無所属」実は「自民支部長」…千葉知事当選の森田氏
スレリンク(newsplus板)

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

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

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

 使途については、「知事選には使っていない。知事選に無所属での出馬を決意する前に、
 自民党候補の応援などのために使った」と釈明した。
 URLリンク(www.yomiuri.co.jp)



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

18:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/04 02:42:58
List<int[][]>にすればいいんじゃない?
int[][]をオブジェクトにしてもいいような気もする

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

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

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

21:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/04 13:55:45
なんつーキモキモ変数名


23:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/04 18:21:31
0xEDB88320 ^ 0
の演算結果が
0xEDB88320
となるのはなぜ?
VB.NETだと1になるんだけど

25:デフォルトの名無しさん
09/04/04 18:32:47
なぜも何も普通だろ。
VBのほうが謎だ。

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

27:デフォルトの名無しさん
09/04/04 19:02:40
>>26
そうでしたか、ありがとう。

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

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

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

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

32:デフォルトの名無しさん
09/04/05 13:10:16
同意

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

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

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

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

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

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

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

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

40:デフォルトの名無しさん
09/04/05 17:18:47
まずはOOじゃなくて構造化プログラミングをば

41:デフォルトの名無しさん
09/04/05 18:09:50
その前に2chを卒業

42:37
09/04/05 18:13:52
>>38,39

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

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

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

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

43:デフォルトの名無しさん
09/04/05 18:15:35
>40

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

URLリンク(plaza.rakuten.co.jp)

そう言えば二次元の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:デフォルトの名無しさん
09/04/05 18:18:37
宣伝乙

45:デフォルトの名無しさん
09/04/05 18:22:07
誰でも知ってるから。

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

47:デフォルトの名無しさん
09/04/05 19:36:35
これはどう見ても釣り
URLリンク(plaza.rakuten.co.jp)
こいつに悪意をもつものの仕業に違いない

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

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

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

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

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

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

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

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

54:デフォルトの名無しさん
09/04/05 20:55:29
というわけでWMIでリモートのPC参照すれば可能かも
URLリンク(d.hatena.ne.jp)

55:デフォルトの名無しさん
09/04/06 08:03:03
C#の本の質問もここでいいのかな?

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

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

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

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

59:デフォルトの名無しさん
09/04/06 10:05:29
レビューはあんまあてにならないだろw

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

61:デフォルトの名無しさん
09/04/06 10:37:29
図書館おいしいです

62:デフォルトの名無しさん
09/04/06 12:17:17
洋書でいいなら、googleやSafariで立ち読みすればいい。

63:デフォルトの名無しさん
09/04/06 12:36:24
もちろん、座って読んでもOKだ

64:デフォルトの名無しさん
09/04/06 14:34:28
だがうんこ座りはご遠慮いただきたく。

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

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


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

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

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


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

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

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

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


72:デフォルトの名無しさん
09/04/06 17:39:20
ググったら似たような質問あったよ
件名:[C#]コントロールのプロパティ固定(継承)
URLリンク(www.atmarkit.co.jp)
セッターを空のメソッドでオーバーライドして殺してるみたい。

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

73:デフォルトの名無しさん
09/04/06 17:43:11
youtubeとかニコニコの動画のダウンロードってどうやるの?

74:デフォルトの名無しさん
09/04/06 17:54:04
一度言ってみたかった・・・
「ググれカス」

75:デフォルトの名無しさん
09/04/06 18:16:56
>>55
洋書でいいなら、中国語でいい本がある

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

77:デフォルトの名無しさん
09/04/06 18:23:40
>>76
  。     。
    。  。 。 。 ゚
   。  。゚。゜。 ゚。 。
  /  // / /
 ( Д ) Д)Д))

78:デフォルトの名無しさん
09/04/06 18:29:53
C#に特定した話じゃないなあそれ

79:デフォルトの名無しさん
09/04/06 18:35:29
・・・もういいです・・・使えない人たちですね

80:73
09/04/06 18:39:47
>79
これ誰だよw

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

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

82:デフォルトの名無しさん
09/04/06 18:44:58
公式はどこにあるのですか?
教えて下さい

83:デフォルトの名無しさん
09/04/06 18:48:53
そりゃニコニコやyoutubeのトップから辿れよ

84:73
09/04/06 18:53:18
>>81
ありがとう調べてみます

>>82
だから誰だよww

85:デフォルトの名無しさん
09/04/06 18:58:28
>>75
中国無理っす

86:デフォルトの名無しさん
09/04/06 19:00:20
>>80,84
いい加減にしてください・・・誰なんですか・・・

87:デフォルトの名無しさん
09/04/06 19:07:16
これが無職いたのよいところ

88:デフォルトの名無しさん
09/04/06 19:16:56
ここまで全部俺の(ry

89:デフォルトの名無しさん
09/04/06 19:22:05
もう私のために争うのはやめて!

90:デフォルトの名無しさん
09/04/06 19:29:15
WebBrowser Controlでの質問です

URLリンク(domworld.cool.ne.jp)
↑のページを完全に読み込みたいんですが、javascript?のところで途中で止まってしまいます

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

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

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

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

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

94:デフォルトの名無しさん
09/04/06 20:54:33
>>91-93さん
レスありがとうございます

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

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

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

WebBrowserコントロールからフレームを利用したのページのHTMLソース取得方法
URLリンク(social.msdn.microsoft.com)

95:デフォルトの名無しさん
09/04/06 22:15:40
>>94
がんばればできる。

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

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

サンプルプロジェクト:
URLリンク(www1.axfc.net)
pass: invoke

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

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

97:デフォルトの名無しさん
09/04/08 16:04:51
とりあえず俺の環境では起きないんだが

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

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


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



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

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

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

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

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

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

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

103:デフォルトの名無しさん
09/04/08 20:38:21
ほんとだうちの環境でも壊れたぞ。

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

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

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

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


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

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

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

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

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

109:デフォルトの名無しさん
09/04/08 23:03:36
μsはmsの間違いだと思う。

110:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 00:08:41
>>96
なんか分かってるのか分かってないのかよく分からんコードだな、というのが率直な感想。
なぜそうしているのか理由や必然性がわからない部分が多すぎる。
ちょっとVB上がりのコピペプログラマの臭いがする。

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

112:デフォルトの名無しさん
09/04/09 01:04:43
>>110
テキストの更新をするだけならInvaridateで十分なのですが、ボタン操作やメニュー、ショートカットキー等々の
UIの操作を行った際に発生するイベントを処理するためにDoEventsを差し込んでいます。
そういう意味で、ボタン操作やテキストの更新と書きました。

>>111
VBの方はほとんど触ったこと無いですw
実際に使用する際には画面更新中に発生したTickの回数分だけ処理をとばすようにはするのですが、
その前にタイマーがちゃんと動作するかどうかを確認している際に発生したのがこの現象です。
サンプルの方はDock.Fillなはずのコントロールがリサイズできてしまうということを確認してもらうために
余計にコントロールを追加していたり、タイマーが回っているのを視覚的に確認するために画面更新していたり
しますが、実際にはウインドウにHScrollBarを貼り付けても発生しますし、TickのDrawを中身空っぽのforを
10万回回した後にDoEventsするだけでも発生します。

113:デフォルトの名無しさん
09/04/09 01:13:01
どんなに Interval の数値大きくしてもCPU使用率が上に張り付くんだけど
本当にこれで処理大丈夫なの?

114:デフォルトの名無しさん
09/04/09 01:29:36
>>112
あほな自家製タイマーがメッセージループを占有しなければ、
>UIの操作を行った際に発生するイベント
はdoeventsなんか呼ばなくてもちゃんと処理されるのだけどね。

メッセージループ経由でのUIの更新は動画のような短時間での更新向きではない。
なんかWin3.1のころのメッセージループのアイドルにバックグランド処理をやらせる
のを念頭に置いたりしてないか。

115:デフォルトの名無しさん
09/04/09 02:46:55
マイクロ秒とかそもそもリアルタイムOSじゃないWindowsには過酷すぎる要求ではないか

116:デフォルトの名無しさん
09/04/09 09:13:24
>>112
ちょwww
スレッド分けてる意味のないコードになってるってことじゃないのか…・

117:デフォルトの名無しさん
09/04/09 09:16:13
>>112
valid
Invalid
Invalidate

2回以上同じところを間違えると馬鹿みたいだぞ

118:デフォルトの名無しさん
09/04/09 09:50:34
根本的にわかってないようだな

119:デフォルトの名無しさん
09/04/09 11:49:46
vb触った事無いらしいが
作りこみがVBにしかみえない

120:デフォルトの名無しさん
09/04/09 12:17:54
VBっぽい作り込みとC#っぽい作り込みって具体的に
どの辺が違うんですか?素で気になります。
初心者の書き方っぽいだけでVBが悪いわけじゃないのか
VBを使うと必然的にそうなるのかよく分からない。
もしかして.netのVBを指している訳じゃない?

121:デフォルトの名無しさん
09/04/09 13:26:42
VB6っぽいというべきだろうな。
.NETでDoEventsを使っているなら9割がた間違った使用法と考えるべき。
何のためのスレッドかぜんぜん理解していないようだし、
Control.BeginInvokeが何をしているかも理解してないな。

122:デフォルトの名無しさん
09/04/09 17:33:25
誰かFormとマルチスレッドとConrol.BeginInvokeについて説明してやれよ

123:96
09/04/09 20:24:27
>>121
・Application.DoEventsは、処理中に発生したイベントをすべて処理する
・スレッドは重い処理などをバックグラウンドで処理させたり、処理を並列して行うことにより高速化を図る
・Control.Invokeは別スレッドからのUIの操作をUIを持つスレッドに行わせ、BeginInvokeは処理の完了を
 待たずに制御を戻し、処理の状況を確認するためのIAsyncResultを返す

と理解しているのですが、違うのでしょうか?
もし違うのであれば、参考となるページでもいいので教えていただきたいのですが…

124:デフォルトの名無しさん
09/04/09 20:26:59
そこまでわかってれば、DoEventsを使う必要には迫られないはずだが

125:デフォルトの名無しさん
09/04/09 23:46:32
>>123
VB6はバックグラウンド処理用にスレッドを自由に起動できなかった。
全部の処理はUIスレッドで実行するしかなかった。

だからビジーループ的な処理があると、それを実行している間はUIが
必然的に応答できなくなる。(だってその処理は、プロセス中の唯一のスレッドである
UIスレッドで実行しているのだから。)

その問題をやり過ごす(根本的解決ではない)ためにDoEventsは使われた。
ビジーループの中でDoEventsを実行してやると、その時点でキューにたまっていた
ウィンドウメッセージが全て処理される。つまりユーザー目線では、UIが操作に反応する。

自由にスレッドを起動できるドトネトではわざわざUIスレッドでビジーループを
書く必要がないから、わざわざApplication.DoEventsを使用する理由は普通ないはず。

126:デフォルトの名無しさん
09/04/10 00:05:44
>>123
バックグラウンドのスレは高速化じゃなく、ユーザへのレスをよくするのが目的では?

127:デフォルトの名無しさん
09/04/10 00:59:33
マルチコア(CPU)なら、マルチスレッドは高速化に寄与するよ。

128:デフォルトの名無しさん
09/04/10 01:48:03
もちろん、複数スレッドで同時に仕事をやらせればの話だけどね。

129:デフォルトの名無しさん
09/04/10 01:54:50
そもそも、高速化 = レスポンスとスループットの向上 と考えれば間違ってないでしょ

130:デフォルトの名無しさん
09/04/10 01:58:00
レスポンスとスループットはトレードオフになることが多いよ。

131:デフォルトの名無しさん
09/04/10 02:26:08
やりかたによるけど反応返ってこなくなるもんな。

132:96
09/04/10 02:37:10
>>125
では、今回のように別スレッドからBeginInvokeなどが連続して呼ばれて結果的にビジーループ
のようになってしまうような処理の場合、どのようにしてイベントを処理すればいいのでしょうか?
タイマーの精度をあきらめる(そもそも無茶らしいですが)として、

while (!abort)
{
while (doEvent && !abort)
{
Thread.Sleep(1);
}

...

Thread.Sleep(1);
}

としてもTickの内容が重たいとビジーループになってしまうのですが…

ここまでするくらいならSystem.Windows.Forms.Timerかなんかを使ってTickで処理時間分Intervalから引いていった方が
いいような気もしますがw


133:デフォルトの名無しさん
09/04/10 02:41:48
UIに限って言えば
UIが属していないスレッドがいくらビジーループになっても構わないのでは?
あと草が邪魔

134:デフォルトの名無しさん
09/04/10 09:00:49
よくわからんけど、多重呼び出しにならないよう待たせるか、
呼び出す度に重い処理のスレッド作るとか

135:デフォルトの名無しさん
09/04/10 09:23:03
どうせDOEVENTやってんだから普通にInvokeでやってみれば?
そんな重そうな処理でもなさそうだし

Invokeの中身を高速化するために、画像を先に作っといてInvokeで呼び出されている関数内で転送するだけにするとか

以上ド素人の意見でした。

136:デフォルトの名無しさん
09/04/10 10:29:34
そもそも96はどんなソフトを作ろうとしてんだ?

137:デフォルトの名無しさん
09/04/10 10:48:24
CodeDomProvider.CompileAssemblyFromSource()
でソースを動的にコンパイルした場合、そのソースの中から
アプリ本体のクラスを使うことはできるのでしょうか?

138:デフォルトの名無しさん
09/04/10 10:55:39
>>137
普通に出来るでしょ
参照アセンブリに追加すれば
コンパイルする前に参照するアセンブリをロードしなきゃいけないんだったかな
適当にそのアセンブリのクラスを使えばロードされる

139:デフォルトの名無しさん
09/04/10 10:59:48
>>137
CompilerParametersに参照をしたら出来るんじゃなかったっけ?
よく憶えてないけど

140:デフォルトの名無しさん
09/04/10 11:13:08
>>132
わざわざdoevents使うなんて
実質シングルスレッドで動かしてますよと公言するよーなもん

141:デフォルトの名無しさん
09/04/10 19:58:48
>>132
言ってることがよく分からないんだけど、
例えば仮に1msの処理時間が必要な処理があるとして、
この処理を同一のスレッドで1ms未満のインターバルで繰り返すことは
太陽を西から昇らせる以上に不可能だ、というのはOK?

失礼だがなんかこのあたりの当たり前のことを理解してない気もするんだが。

142:デフォルトの名無しさん
09/04/10 20:30:55
>>141
まずその処理が1msで終了するのか勘定してみるといい。
スレッド起動から勘定するんだぞ。

143:デフォルトの名無しさん
09/04/10 20:57:31
>>142?

144:デフォルトの名無しさん
09/04/10 21:09:47
>>142??

145:デフォルトの名無しさん
09/04/10 21:13:00
>>142???

146:デフォルトの名無しさん
09/04/10 22:32:31
UIスレッド以外からUIを操作すると壊れるってのも理解してないような気がする

147:137
09/04/11 01:44:04
>>138 >>139
CompilerParameters.ReferencedAssemblies.Add("EXEファイル名");
でできました。ありがとうございます。

148:デフォルトの名無しさん
09/04/11 04:43:38
ComboBoxコントロールなんですけど
ドロップダウンの表示幅を表示するテキストに合わせて伸縮させることは難しいでしょうか

149:デフォルトの名無しさん
09/04/11 08:12:32
オーナドローでググれば一撃

150:96
09/04/11 12:52:55
>>133
>>132で言ってるのは、別スレッドからTick終了後に間隔を開けずにまたTickが呼ばれるため、結果的に
UIを持つスレッドがビジーになってしまう、ということです。

>>141
そこについては理解しています。
上の方にも書きましたが、BeginInvokeが何度も呼ばれないようにフラグを立てています。
ですが、

                 Tick          Tick
              ├──┤    ├──┤
├───┤├───┤├───┤...
 インターバル ↑ インターバル ↑ インターバル

↑:Tick呼び出し

となればTickとTickの間にほかのイベントを処理することが可能なのですが、今回の場合

                       Tick                  Tick
              ├─────┤├─────┤
├───┤├───┤├─┤├───┤├─┤...
 インターバル ↑ インターバル   待機 ↑ インターバル   待機

となってしまい、結果的にUIスレッドがビジーになってしまうため、ということを言いたかったのです。
わかりにくくてすいません。

>>146
BeginInvokeやInvokeでUIを持つスレッドに処理を任せても壊れてしまうのでしょうか?
別スレッドからUIを直接操作すると壊れる、ということは実験したことがあるのですが…

151:デフォルトの名無しさん
09/04/11 12:55:05
>>150
結果的にUIスレッドがビジーになってしまうため、 → ×
結果的にUIスレッドがビジーになってしまう      → ○

です。

152:デフォルトの名無しさん
09/04/11 13:44:31
あんたはどんなアプリを作ろうとしてんだ

153:デフォルトの名無しさん
09/04/11 15:00:31
>>96=150=151
まず、設計が滅茶苦茶。原因は知識不足にあるのは明白なので、
勉強しろ(ここで問答しても埒が明かない)としか言えない

とりあえず、コードの不備だけ指摘すると、

UIスレッドでdoEvent=trueにしてるから、BeginInvokeが複数回呼ばれる可能性がある
タイミングによって、上記が全て完了する前にdoEvent=falseになっていることがある
その場合、更にBeginInvokeが複数回呼ばれる

で、暫くすると...\(^o^)/

154:デフォルトの名無しさん
09/04/11 15:34:36
>>149
遅くなりましたけど、ありがとうございました。
オーナードローでいろいろ調べてやってみます。

155:デフォルトの名無しさん
09/04/11 15:44:18
doEventフラグがlockまたはvolatileで宣言されてない。
それにdoEventはBeginInvokeする前に設定しなきゃいかんだろ。
もっと言えばInvoke使えばフラグはいらない。

156:デフォルトの名無しさん
09/04/11 15:52:22
もひとつ、BeginInvokeでBitmapに描画、PictureBoxに設定、DoEventsの呼び出しを
やってるわけだが、Bitmapの描画はスレッド側、
つまりBeginInvoke呼び出し前に処理していいだろう。
何のためのスレッドだよ。BeginInvokeの中身は軽くしなきゃ。

157:デフォルトの名無しさん
09/04/11 16:00:08
>>153
> UIスレッドでdoEvent=trueにしてるから、BeginInvokeが複数回呼ばれる可能性がある
その点については、本人は治したと言ってるが、本当に治っているかどうか怪しいな

158:デフォルトの名無しさん
09/04/11 16:15:55
アニメーションを表示するのにpictureboxを使うものなのか?
直接スクリーンに描くにせよ、イメージにいったん描いて画面に転送するにせよ、
普通はPanelか何かにGraphices#drawImageを使うぞ。
そうすればControl.Invoke自体いらなくなる。


159:デフォルトの名無しさん
09/04/11 16:20:26
普通はOnPaint、Invalidate、Updateを使うだろうな

ただし、バックグラウンドで生成した画像を表示する必要があるなら
PictureBoxを使ってもやってることは変わらないかも

160:デフォルトの名無しさん
09/04/11 16:25:47
>>159
動画のようなアニメーションにOnPaint、Invalidate、Updateはつかわんだろう。
はなはだ効率が悪いのに。

161:96
09/04/11 16:41:50
>>152
C#の勉強もかねて自分用の動画編集ソフトを作成しています。

>>153,155
その点については、>>100で指摘を受けてTick呼び出し前にdoEventをtrueにするように修正しましたが、
現在Invokeに置き換えて様子を見ています。

>>156
最終的な目標としては、もう一つスレッドを立ててそこでイメージを生成するようにしたいと考えています。
しかし、まだタイムラインのUIに手をつけたばかりなので、とりあえずTick内でイメージを生成するようにしていました。

>>157
上記の通り、Tickの前にdoEventをtrueにするようにし、BeginInvokeが重複して呼ばれることがないことを
確認しましたが、volatileをつけていなかったため、偶然だったのかもしれません。

>>158,159
PictureBoxよりもPanelに描画する方がいいのでしょうか?
OnPaintやControl.CreateGraphicsで直接描画するのとPictureBox.Imageにイメージをセットするのは
ほとんど変わらないものだと思っていたのですが…

162:96
09/04/11 16:48:26
これだとさっきと言いたいことが変わってる orz

>>156の部分の追記
ただ、ファイルアクセスがネックになってイメージの生成が遅れた場合に>>150の図のようになってしまうので、
これについてもどうにかしたいのですが…

163:デフォルトの名無しさん
09/04/11 16:50:27
アプリ見て大体想像していたが、動画編集アプリかよw
だったら、100マイクロ単位のタイマーなんてぜんぜん必要ねーじゃねーかよ。
なぁ、どっからマイクロ秒なんてものが必要と思ったんだ?

164:デフォルトの名無しさん
09/04/11 16:55:16
DirectShow使えばいいじゃん・・・

165:デフォルトの名無しさん
09/04/11 23:11:58
もうそこまでやるならDirectX使うべきだな

166:デフォルトの名無しさん
09/04/11 23:15:52
WinFormsでリアルタイムで動画イメージ生成して描画とかさすがにありえんわ

167:デフォルトの名無しさん
09/04/11 23:16:04
勉強にケチつけないでいただきたい

168:デフォルトの名無しさん
09/04/11 23:23:40
>>167
偽物乙w

>>165
DirectXにあまり期待してはならない。
しかも自分しか使わないソフトならいざ知らず、
ビデオカードによってはアレだ

169:デフォルトの名無しさん
09/04/11 23:37:22
偽者とは違う
偽装するなら名前欄に番号でも入れるよ

170:96
09/04/11 23:38:53
>>163
30fpsで1フレーム辺り33.333...msで、再生していると徐々にずれてくるかなと思ったのですが、
どうにか100μs単位まで行かなくてもいけそうになりました。
ただ、どちらにしてもやり方的には変わらないので、根本的には解決できてないです。

>>164
DirectShowは、DirectShow.NETを触ったりしましたがさっぱりわかりませんでした。
いろんなDirectShow関連のサイトも行ってみましたが、全く歯が立ちませんでした orz

>>165
DirectXや3Dは全く触ったことがなく、調べてみるとほとんどC++みたいなのですが、
.NET上から触ることはできるのでしょうか?

171:デフォルトの名無しさん
09/04/11 23:44:32
>>170
managed directx

172:デフォルトの名無しさん
09/04/12 00:13:36
あのさ、編集ソフト内での再生ズレを考える必要ないの。(程度によるのは当然)
わかる?編集ソフト内での再生は映像と音声の同期さえあってれば適当な再生速度で十分なわけ。ミリ単位で十分なわけ。
そもそもあんたはマイクロ秒のズレなんてわかるんかよ。
ミリ秒単位でやったとしても1時間のもので40秒しかズレねーんだよ。
ファイルさえきっちり作成できればいいの。
後は、再生ソフトの役目なんだよ。

173:デフォルトの名無しさん
09/04/12 00:18:50
>>172
まあまあ。
それはそのソフト作る側の考え方によるだろ。
自分がそういうふうに作れって言われたわけじゃないんだからおちつけ。



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4322日前に更新/229 KB
担当:undef