C#, C♯, C#相談室 Part52at TECH
C#, C♯, C#相談室 Part52 - 暇つぶし2ch1:デフォルトの名無しさん
09/04/01 10:15:52
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C#, C♯, C#相談室 Part51
スレリンク(tech板)

Visual C# 2008 Express Edition 日本語版
URLリンク(www.microsoft.com)

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

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
まあまあ。
それはそのソフト作る側の考え方によるだろ。
自分がそういうふうに作れって言われたわけじゃないんだからおちつけ。


174:デフォルトの名無しさん
09/04/12 00:22:16
これが落ち着かずにいられるかって!

175:デフォルトの名無しさん
09/04/12 01:11:12
>>170
そうか?
サンプル分かり易いと思うし、それにCodePlexにTimeLine.NETとかSplicerとかいった編集用のライブラリとかある。


176:デフォルトの名無しさん
09/04/12 01:17:58
>>172
納期が決まってるとか予算が決まってるならともかく
趣味レベルなら別にかまわんのじゃ?
編集ソフト内の再生ズレ、なくせるんだったらなくした方がいいと思うし。

177:デフォルトの名無しさん
09/04/12 08:15:18
C#の勉強もかねて・・・・

そういえばみんな言語始めるとき勉強はなにからやってるんだろう

俺は新しい言語をやる時に

画面のコントロールの簡単な使い方
標準的なファイルの入出力
簡単な入力チェック系
データベースの 接続・追加・更新・削除

位からやってる
あとはWEBかクライアントに合わせて色々やること増えるけど




178:デフォルトの名無しさん
09/04/12 08:33:54
またHello Worldからかよorz

179:デフォルトの名無しさん
09/04/12 10:15:50
昔よくやってたのはラインアート作るとか。

今時だと、>>177 で出てるネタを押さえるようないいサンプルアプリが欲しいなぁ。


180:デフォルトの名無しさん
09/04/12 11:39:50
俺の場合は、初めに電卓、次にタイマー等が用意されてるなら、
テトリスやリバーシみたいな簡単なゲームを作る事にしてる。

ある程度、実用 ( 娯楽 ) 性があるものを作成すると、理解が早い気がする。

181:デフォルトの名無しさん
09/04/12 12:35:22
たしかに作ってて多少モチベが上るようなのじゃないと
だれるもんね。

Web サービスのクライアントなんて
結構実装簡単だし、すぐ使えるからよさげじゃない?
REST API 公開してるサービスめちゃめちゃ多いし。

182:デフォルトの名無しさん
09/04/12 13:54:16
>>170
徐々にずれるのが嫌なら再生開始時からの経過時間を使って、
間隔を調整すればいいだろ。

183:96
09/04/12 14:26:29
>>172
>そもそもあんたはマイクロ秒のズレなんてわかるんかよ。
30fps時の端数分(333μs)ずつずれていくと、100フレームほどで1フレーム遅れる計算になります。
数秒再生して1フレームも遅れるのは結構致命的だと思うのですが…

>>175
C++やDirectX、COMを触ったことがないからだと思いますが、何が何だかさっぱり…
ISampleGrabberからIBaseFilterへとか、継承しているわけでもないのになぜキャストできるのでしょうか?
同じメソッドを実装するだけでキャストできるのかと思い、テスとしてみたのですが当然できるはずもなく。
Splicerはおもしろそうですね。

>>182
現在はTickが呼ばれるたびに誤差を計算して次に加算するように変更したので、多分μs単位で
いじらなくてもあまりずれないようにはなっていると思います。

184:デフォルトの名無しさん
09/04/12 17:54:19
>>161
>OnPaintやControl.CreateGraphicsで直接描画するのとPictureBox.Imageにイメージをセットするのは 
>ほとんど変わらないものだと思っていたのですが… 

Control.CreateGraphicsを使えば別のメソッドから使えるというのがメリットなのよ。
GUIはGUIスレッド以外から扱ったらいけないと思い込んでるようだけどこれは例外。
つまり、メッセージループを使ったりBeginInvokeを使ったりする必要がない。
メッセージループのことは気にせずに、
独自のスレッドで連続して処理問題ないということ。(普通はプライオリティを若干下げてやる。)

OnPaintやPictureBoxなどに処理を任せるのは画面が無効になったときの再描画の処理を
やってくれるからであって、短いサイクルで描画を繰り返す場合は、その必要性がない。
Control.CreateGraphicsを使えばInvalidateやUpdateを呼ばなくても指定したタイミングで描画することが出来る。


185:デフォルトの名無しさん
09/04/12 19:18:43
>>184
そんなトンデモ説を得意げに言っちゃだめw

最初の行の「別のメソッドから」は「別のスレッド」と言いたかったんだろうが、
そんな話見たことも聞いた事もない。

Control.CreateGraphicsを使う場合のメリットは、Invalidate⇒OnPaintという
通常の処理に比べてオーバーヘッドが少ないことなんじゃないの?

逆にデメリットは、描画処理を呼ぶトリガーをOnPaintに一本化できないことでしょ。

もっとも、>>96のように短い一定時間ごとに必ず描画するのならダーティー化
された場合のことを考えなくていいからデメリットと言えないんだろうけど。

186:デフォルトの名無しさん
09/04/12 19:30:05
一応、Control.CreateGraphics はスレッドセーフだと言っておこう

187:デフォルトの名無しさん
09/04/12 19:36:55
>>186
すまん確かにそうだったw
グラフィック関連長いこと触ってないんで忘れてたよ。

188:デフォルトの名無しさん
09/04/12 20:13:37
>>96に最小限の修正を加えてろだに上げてみた。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

注、Stopのときの再描画処理としてpicturebox1にPaintイベントを追加している。


189:デフォルトの名無しさん
09/04/12 20:55:18
188です。lockの位置を間違ってた。
複数のスレッドからimageを使うことになるので、
lockはvoid Draw(int rad)全体にかけたほうがよかった。
だた、startフラグで制御してるのでただし実行に影響はないはず。

190:デフォルトの名無しさん
09/04/13 17:01:47
WinアプリでDataGridViewの行を大量に追加・削除するときって
SuspendLayoutとかの呼び出しをやった方がいいんだろうか?
位置を移動させるとかの場合は効きそうだけど今一歩やるべきかどうかの判断がつかないんだが・・・

今はおまじない的にやってるけども


191:デフォルトの名無しさん
09/04/13 21:34:50
データソースをViewから切り離してから追加・削除すると速いかも

192:デフォルトの名無しさん
09/04/14 20:34:17

これ見てみw

国会の無駄な手当てでお手盛り人件費じゃぶじゃぶの実態w
この経済危機に税金をなんでこういう公務員、国会職員に税金くれてるの?
                     ↓
衆議院議員 渡辺周氏「呆れ返る国会のムダ呆れ返る国会のムダ」
URLリンク(www.choujintairiku.com)

内閣の閣議でどれだけお手盛り大盤振る舞い、浪費が行われているかわかるね。

これが自民党-麻生内閣の実態!!




193:デフォルトの名無しさん
09/04/14 20:39:03
>>192
text/plainでくれ

194:デフォルトの名無しさん
09/04/14 21:25:00
なんだかんだで結構親切に教えてくれるおまえらが好き。

195:デフォルトの名無しさん
09/04/14 21:26:06
どういたしまして
分からないことがあったらまたおいで
がんばってね

196:デフォルトの名無しさん
09/04/14 22:06:03
ありがとう。
いつかは教えられる側にまわれるよう精進します。

197:デフォルトの名無しさん
09/04/14 23:00:27
 今、クライアント(C#)-WCF-サーバ(C#)-SQL Serverなアプリケーションを作って
いるんですが、クライアントからデータを検索する必要があります。検索条件
によっては、戻り値のデータが数万件になることもあります。
 そこで、WCFのバインディングのmaxReceivedMessageSizeを大きくして対処
しようと思ったのですが、途中でキャンセルできる必要とサーバのメモリを
節約する必要が生じました。

 どのように実装するのがいいでしょうか?

現在の処理)
1. クライアントが検索条件を指定してサーバを呼ぶ
2. サーバは検索条件によって、SQL Serverの複数のテーブルを検索し、複数
レコードからオブジェクトを組み立てる
3. オブジェクトの配列(やツリー構造)が出来上がったらクライアントに返す

案)
1. サーバはDataReaderでデータベースを検索しているので、一定レコード数
ごとに結果をクライアントにレコード単位でコールバックする。オブジェクト
はクライアント側で組み立てる。
2. DataReaderからデータを読みつつ、一定オブジェクト数ごとに結果をクラ
イアントにコールバックする。ただし、各オブジェクトの大きさはそれぞれ違
うので、オブジェクトの数ではメモリ使用量は計れない。
3. クライアントでデータ取得依頼だけして、数秒おきにサーバに結果を取りに
行く。
4. 戻り値はStreamとし、オブジェクトが出来るたびにStreamにオブジェクトに
入れ、クライアントはそのたびにオブジェクトをデシリアライズする。ただし、
DataReaderを読みつつStreamにオブジェクトを入れる方法がまだ分かってない。

よろしくお願いします。

198:デフォルトの名無しさん
09/04/14 23:06:00
普通に API (鯖側)のほうでページングに対応すれば?


199:デフォルトの名無しさん
09/04/14 23:15:40
どっちも非同期で実装すればいいんじゃね?

200:デフォルトの名無しさん
09/04/14 23:18:27
>>198
ページングとは、
1. クライアントで検索依頼
2. クライアントから1ページ目要求
3. データがなくなるまで、2をnページ繰り返し
ということでしょうか?

サーバで全データをメモリに読み込むことは出来ないので、データベース上に
昇順でユニークなIDが必要になるという理解であってますか?

201:デフォルトの名無しさん
09/04/14 23:20:07
SQL で指定できるでしょ。上限件数

202:デフォルトの名無しさん
09/04/14 23:21:31
>>199
すみません。具体的に御願いできますか?非同期でクライアントから依頼して
サーバから非同期でコールバックするという意味でしょうか?
だとすると>>197の案1, 2ですよね

203:デフォルトの名無しさん
09/04/14 23:23:35
WCF でのサービスメソッド呼び出しを非同期にする。
サーバーでのクエリ実行を非同期にする。

で、適宜タイムアウト。件数が多すぎるとき? シラネ。

204:201
09/04/14 23:23:55
あー、説明不足かもしれんので一応。

TOP 句
URLリンク(msdn.microsoft.com)

ROW_NUMBER 関数
URLリンク(msdn.microsoft.com)

205:デフォルトの名無しさん
09/04/14 23:25:22
>>201
上限件数は指定できます。ただ、最初の件数以降の次のデータを指定するのは
難しい状況です。ユニークで昇順なキーがないので。
データが多いからといって、途中で検索をやめてしまうのはだめです。

ただ、サーバがメモリ不足で落ちるのは駄目ですが、クライアントがメモリ不足
で落ちるのはまだ許容範囲です。

206:デフォルトの名無しさん
09/04/14 23:28:13
ダメです、とか、なんでえらそうなの?

207:デフォルトの名無しさん
09/04/14 23:30:37
>>204
ROW_NUMBER知りませんでした!!使えそうですね。ちょっとこれから調べてみます。

>>206
申し訳ないです。エラーで結果が出ないのはいいのですが、結果が正しくないの
は一番やってはいけないことなので、あのような書き方になってしまいました。

208:デフォルトの名無しさん
09/04/14 23:31:17
>>205
TOP でも 3 回(だっけ?)組み合わせればここからここまでっての
一応できるんだよ。
まぁ天啓にあった某関数と同じ機能な ROW_NUMBER サポして
くれたからこれでよくなったけど

209:デフォルトの名無しさん
09/04/14 23:58:26
カーソル付きのDBMSならHTTP鯖のセッション情報にカーソル情報書き込んでしまえばいいと思った

210:デフォルトの名無しさん
09/04/15 00:08:13
>>209
なるほど。

211:デフォルトの名無しさん
09/04/15 21:30:23
OLAPに対応してるのってMSSQL2008からだよね。
大丈夫かな?


212:デフォルトの名無しさん
09/04/15 22:49:05
質問失礼します。

タスクトレイに格納した状態で再生できるサウンドAPIを探しています。
再生させる際、タスクトレイに格納された状態で、ボリューム調整を行いたいです。

始め、System.Media.SoundPlayerを利用したのですが、音量調整ができませんでした。
次に、Microsoft.DirectX.DirectSound.SecondaryBufferを利用したのですが、タスクトレイに入った状態では再生できませんでした。
上記には勘違いがあるかもしれません。
その点の指摘も含め、分かる方よろしくお願いします。

開発環境:
VisualStudio2008
WindowsXP

213:デフォルトの名無しさん
09/04/15 22:56:04
なんで既にタスクトレイさんがわるものなのぉぉおwwww

214:デフォルトの名無しさん
09/04/15 23:03:29
SetCooperativeLevelが不適切なだけじゃね?

215:デフォルトの名無しさん
09/04/15 23:07:58
ありがとうございます。

協調レベルは真っ先に疑いました。
CooperativeLevel.Normal
CooperativeLevel.Priority
CooperativeLevel.WritePrimary
全部試しましたが、ダメでした。。。

フォームを表示すると鳴るんですけど、何故でしょうね。。。

216:デフォルトの名無しさん
09/04/15 23:14:06
SetCooperativeLevel(this, CooperativeLevel.Priority);
今このようなコードを書いています。
thisがいけないんですかね?

表示しているのはフォームではなく、NotifyIconですからそのownerを指定???
う~む。やっぱり分からないです。。。

217:212 215 216
09/04/15 23:29:32
すいません。
自己解決しました。
BufferDescription の GlobalFocus を true にする事で鳴りました!

218:デフォルトの名無しさん
09/04/15 23:31:14
なーんか似た内容の人が居たらしい
URLリンク(hpcgi1.nifty.com)

219:デフォルトの名無しさん
09/04/16 16:45:54
指定したアセンブリのプロセッサアーキテクチャを調べるにはどうすればいいでしょうか?
VS2008で参照を追加したとき.csprojに
processorArchitecture=x86
などと書かれる情報のことです。
ildasmでマニフェストは見てみたのですが、それらしき情報は見つからなかったです。
よろしくお願いします。

220:デフォルトの名無しさん
09/04/17 05:03:44
プログラムでやるなら、Assembly.ReflectionOnlyLoadFromで読み込んでAssemblyName.ProcessorArchitectureで

221:デフォルトの名無しさん
09/04/17 20:13:06
なんかプロジェクトの規模が大きくなるにつれてIDEが激しく重くなるんですが
どうしようもないんでしょうか?
といってもたかだか*.csファイル数126個、全45109行なんですが。
ユーザーコントロールも10個くらい作ってますが、それも関係してるのかな。

222:デフォルトの名無しさん
09/04/17 21:33:29
exeとは異なる任意のフォルダにdllファイルを置きたいため以下のプログラムを書きました。
(WidgetLibrary.Widgetクラスは別プロジェクトでdllとして作成)これだとWidgetLibrary.Widgetの名前が解決できないのでビルド
できません。ビルドできない原因は何でしょうか?

namespace ConsoleApplication1
{
public class Loader
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += FindAssm;
Program.Go();
}

static Assembly FindAssm(object sender, ResolveEventArgs args)
{
string simplename = new AssemblyName(args.Name).Name;
string path = @"c:\sample\" + simplename + ".dll";
if (!File.Exists(path)) return null;
return Assembly.LoadFrom(path);
}
}
public class Program
{
public static void Go()
{
WidgetLibrary.Widget w = new WidgetLibrary.Widget(1, "a");
w.widgetDisplay();
}
}
}


223:デフォルトの名無しさん
09/04/17 21:41:29
参照設定で追加していないのでメタデータを参照できないのが原因
と思う。

224:デフォルトの名無しさん
09/04/17 21:41:44
自分で言っているように「WidgetLibrary.Widgetの名前が解決できないので」だろ。

225:デフォルトの名無しさん
09/04/17 21:45:01
>>222
任意のフォルダにDLLを配置するのが目的なら、GACに登録した上で参照設定するのが王道。

.NET Frameworkに含まれるDLLは、ローカルコピーしなくても参照できるだろ。
それは.NET FrameworkのDLLが特別扱いされているわけじゃなくて、それらが
GACに登録されているから。
自作のDLLもGACに登録すれば同様に扱える。

226:デフォルトの名無しさん
09/04/17 21:58:34
レスありがとうございます。

>>223
参照設定を追加するとプライベートアセンブリになってしまうので回避したいのです。
>>224
解決策でした。
>>225
GACに登録せずに任意のフォルダに置くことは不可能ということでしょうか??

このソースは C# 3.0 IN A NUTSHELL の558ページのコードを確認したくて
書いたものです。

227:デフォルトの名無しさん
09/04/17 22:20:42
あの本の綴じ込みはすごくいいね
洋書は製本がイマイチなのが多くて困る

228:デフォルトの名無しさん
09/04/17 22:28:17
参照しているアセンブリのプロパティでローカルコピーをオフにすればよい
と思う。

229:デフォルトの名無しさん
09/04/17 22:43:09
>>228
できました。
どうもありがとうございました。

230:デフォルトの名無しさん
09/04/17 23:57:22
GACって何のことか全く知らない俺が、ぐぐる前に適当に妄想してみる。

GACとは、Global Assembly Cacheの略で、システムワイドに.NETのアセンブリを
登録しておくキャッシュ。概念としてはUNIX系のOSでldconfigすると、システム
ワイドに利用するダイナミックライブラリがld.soに登録されるのと似ている。


231:デフォルトの名無しさん
09/04/18 05:25:56
>>230
おまえgoogle先生だろw

232:デフォルトの名無しさん
09/04/18 13:04:23
1.1のContextMenuって、MenuItem.CloneMenuを使用して
状況に合わせたコンテキストメニューを作れみたいになっていたと
記憶してるんですが、
ContextMenuStripだと、ToolStripMenuItemにCloneMenuがないので、
これはどう解釈したらいいんでしょうか?
デザイン時にパターンの数だけ作り付けのContextMenuStripを
用意しとくんですか?

233:デフォルトの名無しさん
09/04/18 20:48:31
Timerで回しているときにint(値型?)の配列が画面最小化すると消えてしまうのですが
残しておきたいです
どうすればいいのでしょうか?

234:デフォルトの名無しさん
09/04/18 20:52:43
>>233
それだけで回答すると、
そりゃあんたの作り方次第としか言いようがない。

235:デフォルトの名無しさん
09/04/18 21:02:42
>>234
作り方が悪かったですorz
OnActivatedを初めてFormが表示されるときにだけ呼ばれると勘違いしてました…


236:デフォルトの名無しさん
09/04/18 22:06:35
それなんてLoadイベント

237:デフォルトの名無しさん
09/04/18 22:51:48
例えばZキーが押された状態でAを押してもOnKeyDownが発生しません。
これをZキーが押されている時にAが押されていることを知りたいのですがどうすればいいでしょうか?


238:デフォルトの名無しさん
09/04/18 23:06:29
e.Handled = true;でいけました

239:デフォルトの名無しさん
09/04/18 23:12:15
先日、C言語の勉強を始めた者です。まだまだ参考書の始めの方なのですが、エラーが起きてよくわからないことになってしまいました。
いまだにキーボードから数値を入力させて、それを表示する程度のものの自己流改変なのですが、なぜか二つ目を入力した後にエラーが起きて止まってしまいます。
それと、途中でプログラムの流れを止める方法がわからないので、それも出来れば教えていただけませんでしょうか?
とりあえず理想としては、エンターを押してからもう一度押す迄
変数X + 1の答えを変数Xに代入し続けるようなプログラムが作りたいのです。

一応、ソースを書いておきます。

#include <stdio.h>

int main(void)
{
int PS;
float PS2;
float PS3;

printf("まずは整数を入力してください。");
scanf("%d",PS);

printf("次は、小数を入力してください。");
scanf("%f",PS2);

printf("最後にもう一度、小数を入力してください。");
scanf("%f",PS3);


int end;

printf("では、なにか数字を入力してエンターを押すと、結果が表示されます。");
scanf("%d",end);

240:デフォルトの名無しさん
09/04/18 23:13:35
>>239
すれ違い

241:デフォルトの名無しさん
09/04/18 23:13:52

printf("最初の整数は %d ですよね?",PS);
;
printf("そして次は少数一回目は %f ですよね?",PS2);
;
printf("そして最後は、 %f となっておりますよね?",PS3);
;

int red;
printf("最後に、面白いものを見せましょう。適当に数字を入れてエンターを押してください。");
scanf("%d",red);

printf("exeファイルのダブルクリックをしていなければ、適当に入れてもらった数字を足した数を「%d」内に表示しておきます。では、さようなら。",end + red);


return 0;
}

最後のprintf()が終わっても自動的に閉じないようにするには、いったいどうすればいいのでしょう?

242:239,241
09/04/18 23:15:53
申し訳ございません。
スレ名をチラっとしかみていませんでした。本当に申し訳ありません。

243:デフォルトの名無しさん
09/04/18 23:36:08
C#ってヘッダーファイルが無いのか。
変な言語だな。
C#って手続き型のプログラムができないのか。
不便な言語だな。
C#って関数に省略可能な引数を使えないのか。
代替手段としてオーバーロードしないといけないのか。
馬鹿げた言語だな。
C#ってswitch文でbreak無しで下に降りることができないのか。
気が狂ったような言語だな。
それと、0かそうでないかを評価できないのか。
初期化する前の不定値を参照するのはコンパイルエラーか。

244:デフォルトの名無しさん
09/04/18 23:46:36
省略可能な引数は確かにほしいな。
他のは賛同しかねるが。

245:デフォルトの名無しさん
09/04/18 23:49:30
省略可能な引数はC#4.0で追加される。

swichでのフォールスルーに関しては議論が分かれるとこだろう。
C#ではステートメントを含まない場合にのみ許可されている。
gotoステートメントによってラベル付きステートメントに直接移動する事もできるけど滅多に使われない。

246:デフォルトの名無しさん
09/04/18 23:58:26
>>239
初心者は恐ろしいことするよなぁ

247:デフォルトの名無しさん
09/04/19 00:00:32
セグメントエラーです。。。

248:デフォルトの名無しさん
09/04/19 00:37:30
C#はC言語の標準関数を使えないんだろ。
ぼろい言語だな。.Netでしか通用しないノウハウだな。

C++ならC言語のノウハウは生かせるから、VC++やC++Builderで、MFCやVCLの知識は無いけども、
イベントハンドラにC言語のコードを差し込んで、単にGUIの画面を借りるだけのスタイルで、
普段コマンドプロンプトのプログラムしか作らない俺でも、Windowsプログラムを作れたぞ。

249:デフォルトの名無しさん
09/04/19 00:49:14
釣りたいならもっと勉強してから出直してきな

250:デフォルトの名無しさん
09/04/19 01:10:24
>>243>>248 は逆に、C/C++ への皮肉だと思う。


251:デフォルトの名無しさん
09/04/19 01:14:24
C#でC言語の標準関数を使った事がある俺は神か

252:デフォルトの名無しさん
09/04/19 01:14:35
ある意味釣られたってわけだなw

253:デフォルトの名無しさん
09/04/19 01:17:50
ああ、msvcrt*.dllの関数も呼べるよな

254:デフォルトの名無しさん
09/04/19 01:39:12
C++人はマネージ拡張C++に手を伸ばせば同じことができるし、
VB6人やMS-Office VBA人は差分学習ですぐにVB.netやれるし、
(中途半端に似ててかえって混乱するとかいうのはデマ)
.Netしか通用しないノウハウのC#を学習する意味不明。

255:デフォルトの名無しさん
09/04/19 01:42:37
C互換ライブラリとかどこかにあったりしないかな。
C.StdIO.Printf() とか用意してある

256:デフォルトの名無しさん
09/04/19 01:42:57
第二段来ました

257:デフォルトの名無しさん
09/04/19 02:07:22
>>254
ところがどっこい。
.NETのサンプルがC#だけで出て来る例というのがよくあるため、
VBの人もC++の人もC#のサンプルを見て自分の言語に移す羽目に。

ここから蛇足。一昔前だったら、Cで書かれたWinAPIのサンプルを
VBへ移したり、C++ならクラスでラップしてみたりしていたわけで、
時代が移ってもやっていることに変わりはないのさ_| ̄|○

258:デフォルトの名無しさん
09/04/19 02:09:54
しっ、話しかけちゃいけません!

259:デフォルトの名無しさん
09/04/19 02:10:41
>>254
じゃあdelphiしか選択肢がないな

260:デフォルトの名無しさん
09/04/19 02:14:42
kylixってどこいったん?

261:デフォルトの名無しさん
09/04/19 03:24:35
>>257
要は君はコピペグラマってこと?
だったら.NETの問題っていうより君自身の問題なんじゃないの?

普通はサンプルの考え方を拝借することはあってもコードをそのまま引っ張る
なんてしないよ。

262:デフォルトの名無しさん
09/04/19 03:47:00
そりゃそうだ。だいたい、C#に癖のある構文なんてそんなに無いから、
サンプルを理解するくらいなら特にC#の知識を持ち合わせていなくても問題ないだろう。

もっとも、VB.NETやC++/CLIからもうちょっと手を伸ばせばC#にも手が届くだろうとは思う。
手が届くというだけではC#を学習する理由にはならないから、254への答えでは無いけどな。

263:デフォルトの名無しさん
09/04/19 08:38:49
>>239が一瞬HLSLに見えた

264:デフォルトの名無しさん
09/04/19 08:53:42
あんな見え見えの構ってちゃんの相手してやるんなら>>239に答えてやればよかった
もういないだろうけどscanfの引数は取得したい値を格納する変数のポインタを入れなきゃだめだよん

265:デフォルトの名無しさん
09/04/19 10:09:38
一章とかでscanf()してる入門書とかあるからなあ

266:デフォルトの名無しさん
09/04/19 10:47:06
いまだにCやるときはscanfを使う俺
なんで一行読み込みがgnuのgetlineしかねーんだよ・・・標準で作れよ
メモリ確保こわい

って感じ

267:デフォルトの名無しさん
09/04/19 18:12:40
fgets して sscanf するのが面倒だから
getopt に頑張ってもらうか適当な設定ファイル読ませるようにしちゃうなぁ。

つか C# 関係ないな。

268:デフォルトの名無しさん
09/04/20 02:23:31
たまに使うVC++でgetline()を使おうとして、「あれ?」と思う俺。

269:デフォルトの名無しさん
09/04/20 11:37:48
Collection系(例えばQueue)でロックされた状態で処理を行いたいとき

1.lock(独自のロックオブジェクト)
2.lock(対象.SyncRoot)
3.Queue.Synchronized(対象)

とか考えられるんですが

使い分けの方法がわからない
1・・・コレクションだけではなくその他の変数やオブジェクトもロックしたいときにまとめて一回でやりたいから使うかなと
2、3 この違いは一体何なのか教えてほしいです。

そして Queue.Synchronized でMSDN調べたら
同期されている (スレッド セーフな) Queue ラッパーを返します
とありますが、型が同じということだけはわかりますがこれはコピーされたオブジェクトなのかそれとも元の本体そのものなのか・・・

予想すると
3のラッパーはオブジェクトのディープコピーをかえしてきて読み取り専用的に扱う
削除なんかは3の操作ではできないから1,2の方法を使って要素を削除したり

こんな考え方でいいのでしょうか?




270:デフォルトの名無しさん
09/04/20 21:40:44
>>269
.Net Reflector

271:デフォルトの名無しさん
09/04/20 22:08:11
ソース公開されてるからReflector使わんでもええやん

272:デフォルトの名無しさん
09/04/21 05:09:56
ReflectorとReflectionは違うものですか?

273:デフォルトの名無しさん
09/04/21 05:15:22
>>272
うん

274:デフォルトの名無しさん
09/04/21 05:20:35
ツールか。新しい機能かとオモタ

275:デフォルトの名無しさん
09/04/21 08:45:40
>>269
どっちかっていうと1.2.が似てて、3.が違うよ
3はクラスメソッドがスレッドセーフになったコレクション。
Dequeue()やEnqueue()はスレッドセーフで実行できるけど、
列挙処理中はSyncRoot等でロックしないと別スレッドでの変更に対応できない

あとラッパーっていうのは元のオブジェクトに
新しい機能をかぶせるテクニックの総称だから元の本体だね
削除も普通にできる

276:デフォルトの名無しさん
09/04/21 08:49:30
object ICollection.SyncRoot
{
get
{
if (this._syncRoot == null)
{
Interlocked.CompareExchange(ref this._syncRoot, new object(), null);
}
return this._syncRoot;
}
}

277:デフォルトの名無しさん
09/04/21 11:09:13
説明ありがとうございます。

>>275
列挙している間に別スレッドからの追加・削除処理が入る場合は基本ロックが必要そうですね・・・
そこまで処理速度が必要そうなわけでもないので、ひとまずロックさせて使ってみようと思います。

>>276
結局は内部で専用のロックオブジェクトを提供してくれているだけという感じでしょうか

278:デフォルトの名無しさん
09/04/21 13:29:20
Shared code , Shared source といった類のキーワードでgoogle先生に聞けば以前はあっさり見つかっていたのに・・・
どこにいったんだろう?
VisualStudioのライブラリソースコード表示の説明リンクを次から1の直下に張り付けておいたら良いと思う。
誰か場所知っていたらリンク張って欲しいです。

>>277
実はソースコードみた方が圧倒的に正確だしてっとりばやい、凄い単純な実装なんで。
URLリンク(www.microsoft.com)
とりあえず VisualStudio からではないですが、ソースコードです。
ダウンロードしてgrepして探してみてください。

279:デフォルトの名無しさん
09/04/21 18:40:07
条件によって異なる複数の変数(string或いはint)を
配列化して(一列に並べて)、各変数に代入するメソッドを変数の個数だけ実行したいのですが、
デリゲートを使うとオーバーロードできないため、Object型を渡して判別するという事も考えたのですが納得できません。
unsafeのポインタを使うべきなのでしょうか。

280:279
09/04/21 18:52:28
すみません。具体的に言うと
foreach (string tmp in bufStr)
{
str = DataTypeCheck(tmp);

if (str == null)
{
//・・ここでメソッドを呼び出してそれぞれ代入
}
else if (str == "case1")
{
//・・代入する変数のリストを作成
}
else if (str == "case2")
{
}
}
データ(string[])は以下のようになっており
case1
a
b
case2
・・・
この場合はa,bをcaseに応じた変数に格納します。

281:デフォルトの名無しさん
09/04/21 19:23:47
具体的といいつつ酷く分かりづらいな
Func<T>でも使えばいいんじゃね
privateなメソッドなら型制約とかもいらんっしょ

282:279
09/04/21 19:53:25
>>281
説明下手で、すみません。
ググりましたが、おそらくお察しの通りです。
感謝いたします。m(_ _)m

283:デフォルトの名無しさん
09/04/22 19:00:44
Dispose()のCLRにマネージされていないデータを解放するという説明を読んで思ったのだけど、
CLRにマネージされてるかどうかってのはつまりどういう事なの?

284:デフォルトの名無しさん
09/04/22 19:12:25
ざっくりいってIDisposableがマネージド、IntPtrがアンマネージド

285:デフォルトの名無しさん
09/04/22 19:23:50
>>283
C++なんかだと、COMやスマートポインタを使って、リファレンスカウンタで生存管理をしているんだが
この方式だと、参照がなくなると同時に解放処理がされる。
対して、ガベージコレクタを使った.NETでは解放処理はメモリーが尽きたとき。
で、C++では参照がなくなると同時に解放処理を行う事を前提に組んであるケースが多いんだ。
だからC++の場合ちゃんとリファレンスカウンタで管理されているファイルシステムオブジェクトなどはこのタイミングでClose処理もされるのでCloseを忘れていても大丈夫
アンマネージをラップしたクラスを作るとこれが問題になることがある、これ明示的に開放する関数がDisposeだよという意味。
あくまでもラップした先のオブジェクトの解法、ラッパ事態はマネージドなので、ガベージコレクタで解放される。
たとえば.NETでStream系のオブジェクトでこれを忘れていると、Closeしわすれているとガベージコレクタで回収されるまでOpenされっぱなし。

286:デフォルトの名無しさん
09/04/22 19:42:28
>>283
CLRの関与していないところで確保したもの。主にWin32ハンドルとか。

287:デフォルトの名無しさん
09/04/23 13:27:12
IntPtrにAPIで取得したハンドルなんかもIntPtr.Zeroとかやった方が
いいんですかね…。基本的にマネージド以外の方法で取得したものは
全て何かしらの処理を加えた方がいいんでしょうか。

288:デフォルトの名無しさん
09/04/23 13:35:57
意味が分からん
アンマネージドリソースの解放ってのはIntPtr.Zeroを変数に代入することじゃないぞ
CloseHandleとかDeleteObjectとかのAPI関数呼び出しのことだぞ
処理した方がいいかどうかじゃない、必要な手順で解放する必要がある
もちろんシステムグローバルな値とかでその必要が無いものもあるがな、ウィンドウハンドルみたいな

289:デフォルトの名無しさん
09/04/23 14:14:38
請求書捨てても借金ちゃらにならない感じ

290:デフォルトの名無しさん
09/04/23 22:32:21
あとIntPtrを生で使うんじゃなくてSafeHandle使え

291:デフォルトの名無しさん
09/04/23 22:37:01
VisualStudio2008のツールボックスで使われているみたいな、プッシュピンで表示/非表示を切り替えられるGUIは、.
Netの標準コントロールとしては提供されていないのでしょうか?
市販コントロールには似たようなものがあるようなのですが。
よろしくお願いします。

292:デフォルトの名無しさん
09/04/23 22:48:19
標準には無い

293:デフォルトの名無しさん
09/04/23 23:42:08
オレそれ市販の買おうか真剣に悩んでる。
devexpressの試用版DLしたとこ。

294:デフォルトの名無しさん
09/04/24 00:05:34
>>292,293
残念です。Microsoftも便利な部品はどんどん使えるようにして欲しいですね。

295:デフォルトの名無しさん
09/04/24 00:11:37
>>294
どんどんしてるんだけど、今、SilverlightとかASP.NETとかの優先順位がむちゃくちゃ高いから、
VS風ドックコントロールは、ちょっとやそっとの要望あっても当分後回しになると思う。


296:デフォルトの名無しさん
09/04/24 08:36:28
>>287
API直接操作するなら、APIの仕様通りに使わないとアカンで
マネージド側の特徴もちゃんと考慮して、アンマネージドの処理がアンマネージドの仕様に合うように。

297:デフォルトの名無しさん
09/04/24 09:05:35
【知的財産】中国:ITソースコード強制開示強行へ・制度を5月に発足…国際問題化の懸念 [09/04/24]
スレリンク(bizplus板)

298:デフォルトの名無しさん
09/04/26 16:20:35
質問ですが、Flashのムービークリップの様に、
同じ性質を持ったオブジェクトの中にオブジェクトを上限なく動的に入れる方法はありませんか?

299:デフォルトの名無しさん
09/04/26 16:29:21
List<T> じゃあかんの?

300:デフォルトの名無しさん
09/04/26 16:32:52
表示上のオブジェクトという話かな?XAMLでどうよ。


301:298
09/04/26 16:56:29
>299-300
ありがとうございます。そこまで複雑な事ではないです。

302:デフォルトの名無しさん
09/04/26 17:06:03
じゃあどういうことよ、なのよ

303:デフォルトの名無しさん
09/04/26 17:09:44
int[] array = new int[999999];
とでもやって多めに確保しとけ

304:デフォルトの名無しさん
09/04/26 17:11:07
>>301
むしろ>>298の説明のほうがそれいじょうに複雑なことではあります

305:デフォルトの名無しさん
09/04/26 18:35:03
Compositパターンのことを言ってるんじゃないの?

306:デフォルトの名無しさん
09/04/26 18:35:51
「コンポジットパターン」と言いたいんじゃないかな?
ということで、これでぐぐってみてください。

307:デフォルトの名無しさん
09/04/27 08:52:01
このスレはやさしいエスパーが多いな

308:デフォルトの名無しさん
09/04/28 00:51:39
FormBorderStyle.Noneにして標準のタイトルバーとか表示させないで独自のものを表示したりしています。
タスクバーの右クリックでのシステムメニューは下のURL等を見て表示できるようになったんですが、最小化などが無効になったままです。
これは何かメッセージを処理したりすれば有効にさせることなど出来るのでしょうか?
最大化などもFormのWindowStateをNormalのまま最大化らしくふるまうように無理くりやっています。

もしくはこんな風な独自のウィンドウを作る時の従うべき方針などあれば是非是非エロイ人

309:308
09/04/28 01:11:26
さーせん、const int WS_MINIMIZEBOX = 0x20000;
とかをCreateParamsのStyleに追加したら最小化も表示されたっす。


310:デフォルトの名無しさん
09/04/28 01:39:19
Graphicsに任意のControlを描画することって出来ます?
var webControl=new WebControl()
webControl.Draw(graphics);
みたいな感じで。


311:デフォルトの名無しさん
09/04/28 01:44:28
Excel 2003 vbaの関数をC#から呼んでるんですが
実行時にvba内のブレークポイントで処理を止めるには
どうしたらいいんでしょうか。

312:デフォルトの名無しさん
09/04/28 02:05:10
>>310
でやってみていかがでしたか?

313:デフォルトの名無しさん
09/04/29 18:41:06
public partial class Form1 : Form
{
[DllImport("libmecab.dll")]
extern static int mecab_new2(string arg);
[DllImport("libmecab.dll")]
extern static string mecab_sparse_tostr(int m, string str);
[DllImport("libmecab.dll")]
extern static void mecab_destroy(int m);

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
int mecab = mecab_new2("");
string s = mecab_sparse_tostr(mecab,textBox1.Text);
mecab_destroy(mecab);
textBox2.Text = s;
}
}

これがXPでは動くのだけど、Vistaでは動かない。

mecab_sparse_tostr(mecab,textBox1.Text); で
System.AccessViolationException はハンドルされませんでした。
Message="保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。"
がでる。
意味がわからない。なぜ?

314:デフォルトの名無しさん
09/04/29 18:51:15
そのメカブってどこからもってきてんのよ

315:デフォルトの名無しさん
09/04/29 18:55:02
これ。
URLリンク(mecab.sourceforge.net)


316:デフォルトの名無しさん
09/04/29 18:55:19
オレも何かメカブそば食いたくなったわw

317:デフォルトの名無しさん
09/04/29 18:58:36
実はVista x64版だったというオチ、とか

318:デフォルトの名無しさん
09/04/29 20:04:16
>>317
それはさすがに大丈夫だった。
また、Mecabインストール時についてくるEXEは、普通に動きます。

319:デフォルトの名無しさん
09/04/29 20:06:30
とりあえずpInvoke行って宣言正しいかみてこようず

320:デフォルトの名無しさん
09/04/29 20:37:13
>>313
いま実際に動かしてみた
返値がStringだとマーシャラがギブアップするみたい
IntPtrで受けてMarshal.PtrToStringAnsiとかで文字列変換すべし

321:デフォルトの名無しさん
09/04/29 21:21:30
ref string でもいけそうな気がする。

322:デフォルトの名無しさん
09/04/29 21:28:24
返値にrefは使えない

エラーが出る原因だけど、あくまで推測レベルだが
返値にStringを指定した場合UnmanagedType.BStrならSysFreeStringが、
それ以外ならLocalFreeだかCoTaskMemFreeだかが自動的に呼び出されたはずなんで
メモリ周りの保護の強化との兼ね合いと思われる

323:デフォルトの名無しさん
09/04/29 22:10:13
>>320 >>322
ありがとう。XP、Vista両方動いた。


324:デフォルトの名無しさん
09/04/30 09:23:57
DataGridviewって動的列つかったCross集計もできないし機能ショボスギですね 代わりにMSレポートのマトリックス使ってますが将来DataGridviewにGrapeCityのGridみたいな機能が付加されることはないでしょうか

325:デフォルトの名無しさん
09/04/30 11:46:10
高機能すぎると独禁法が面倒なんだ

326:デフォルトの名無しさん
09/04/30 14:35:30
コンポーネントは機能が少ないほど良い。

327:デフォルトの名無しさん
09/04/30 19:31:39
×コンポーネントは機能が少ないほど良い。
○コンポーネントは機能が洗練されているほど良い。

328:デフォルトの名無しさん
09/04/30 21:23:18
>>326機能ゼロが最高だよね。

329:デフォルトの名無しさん
09/04/30 21:52:40
せめてAlt+F4で終了する機能ぐらいはつけてくれ

330:デフォルトの名無しさん
09/04/30 22:54:12
ListView を View == Details で使っていて、
選択された行をタブ区切りでクリップボードに転送してみようと思っているのですが
簡単な方法もしくは、一般にListViewからクリップボードへの定型的なやり方ってありますか?

331:デフォルトの名無しさん
09/04/30 23:02:53
1パターンしかないと思うが 細かい差異はあるかも知れんけど

332:デフォルトの名無しさん
09/05/01 02:27:08
C++で
const int data[] = {1, 2, 3, 4};
のようにやっていたのを

C#で書き直したいんだけど、
const int[] data = {1, 2, 3, 4};
とか
const int[] data = new int[]{1, 2, 3, 4};
って書くと文句言われる。

int[] data = {1, 2, 3, 4};
なら、文句言われなくなるんだけど、

C#でconst配列の初期化ってどうすればいいの?

333:デフォルトの名無しさん
09/05/01 02:29:31
そんなもの無い
dataそのものへの代入不可ならreadonly
要素の変更不可ならReadOnlyCollection<T>でラップ

334:デフォルトの名無しさん
09/05/01 02:31:20
private readonly int[] data = new int[] {1,2,3,4};

335:デフォルトの名無しさん
09/05/01 11:22:09
>>334
配列の要素に書き込めます

336:デフォルトの名無しさん
09/05/01 11:37:53
>C++で
>const int data[] = {1, 2, 3, 4};
は要素の書き換え可なの?

337:デフォルトの名無しさん
09/05/01 12:22:30
>>336
それは
int const data[] = ...
と同義だから、constはintに掛かってて、要素は書き換えられない。

338:デフォルトの名無しさん
09/05/01 13:03:46
スレ違いだが、

>>336
要素の書き換えは不可。

>>337
前半がウソ。それは同義ではない。

339:337
09/05/01 13:40:55
ごめん適当に書いたんだけど、C++とCで違いがあるの?
リンケージ変わったりとか?

340:デフォルトの名無しさん
09/05/01 14:16:41
static または auto に宣言しているなら変わらないかと、つか C# スレですが
専門のスレで聞いた方が良いで

341:デフォルトの名無しさん
09/05/01 14:21:46
>>335
readonly System.Collections.ObjectModel.ReadOnlyCollection<int> data = Array.AsReadOnly(new int[] { 1, 2, 3 });
こうかな、使ったことないんで自分で確かめてくれ。

342:デフォルトの名無しさん
09/05/01 14:23:28
読み取り専用その他、各種アダプタ類は、class に static 関数として定義されている事が多いんで、いろいろ見てくらはい。

343:デフォルトの名無しさん
09/05/01 16:36:37
メインのフォームから別スレッドを起動して、そのスレッドからフォームのテキストボックスにアクセスすると
CrossThreadMessagingExceptionが投げられるのですが、どのように回避するのが良いでしょうか?

344:デフォルトの名無しさん
09/05/01 16:42:06
コントロール スレッド でぐぐれ

345:デフォルトの名無しさん
09/05/01 17:48:18
スレッドをAbort()した後に、同じスレッドをStart()すると、
ThreadStateException
{"スレッドが実行中か、または終了しています。再起動できません。"}
が投げられます。

一度Abort()したスレッドを再開するにはどうすればよいでしょうか?
毎回new Threadをし直す必要があるのでしょうか?
できれば、new Threadはアプリ起動時に1度だけで済ませたいです。

346:デフォルトの名無しさん
09/05/01 18:00:27
メッセージどおり、Abortしたら再起動はできない
つーかAbortなんか使っちゃダメ SuspendとかResumeとかも禁止
フラグとかでスレッド自身が自分の状態を管理するようにする

別にThread作りなおしてもかまわんとは思うが

347:デフォルトの名無しさん
09/05/01 18:08:39
自分も独学でフラグで誤魔化したので、
スレッドの待機をメッセージが無い.NETでどうするか疑問だった

マジでみんなフラグ管理で逃がしてるの?

348:デフォルトの名無しさん
09/05/01 18:48:39
>>346
Resume、Suspendは「使用しないでください」と書いてありますが、Aboteには書いていません。
何故、Abortを使うのはダメとおっしゃっているのでしょうか?

349:デフォルトの名無しさん
09/05/01 18:52:43
>>348 マジ?どこどこ??

350:デフォルトの名無しさん
09/05/01 18:56:26
>>348
メモとかに書いてるっしょ どこで終了するか分からないからオブジェクトが不完全な状態になりうるとか
更には確実に終了されるかどうか保証できないとか実にやばそうな匂いが漂ってくる

351:デフォルトの名無しさん
09/05/01 19:14:36
>>349
Visual C# Express 2008のインテリセンス

>>350
そうは書いていないようです

352:デフォルトの名無しさん
09/05/01 19:26:48
インテリセンスて
ヘルプの解説見ろよ……

353:デフォルトの名無しさん
09/05/01 19:35:28
>>352
ヘルプの解説でも、
SuspendとResumeの項には
「メモ : このメソッドは,互換性のために残されています。」
「[ObsoleteAttribute("Thread.Resume has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. URLリンク(go.microsoft.com)", false)] 」
とありますが、
Abortの項にはありません。

詳しくはヘルプをご覧ください。

354:デフォルトの名無しさん
09/05/01 20:21:44
Thread.Sleep() に Timeout.Infinite を渡す。
再開は Thread.Interrupt() で ThreadInterruptedException をスローさせる。

355:347
09/05/01 21:40:05
さんくす

Thread.Interruptのコード例でsleepSwitchフラグの位置がイマイチ納得いかなかったけど
>>354に書いてあるように使うよ

356:デフォルトの名無しさん
09/05/01 22:04:03
>>347
一般にはフラグは使わない、イベントやセマフォやミューテックスの類を使って制御する。
フラグは簡単にミスするしバグりやすいよ、CPUパワーは無駄にするし、スレッドの実行優先順位も狂って非効率になる。

357:デフォルトの名無しさん
09/05/01 22:10:40
再開はそれでいいんだけど休止をどう伝えるのかイメージつかないんですが

358:デフォルトの名無しさん
09/05/01 22:25:42
>Thread.Interruptのコード例でsleepSwitchフラグの位置
デバッガで確認したけど、Thread.SpinWait(10000000);の行には行かないね。
シングルコアだとJoin呼ぶまでスレッド動かないからだね。
試しにInterrupt()のあとでThread.Sleep()入れてメインスレッドをスリープ待機に
入れちゃうとThread.SpinWait(10000000);がThreadInterruptedException起こすし。
マルチコアだと動かないんじゃないか?このサンプル。

359:デフォルトの名無しさん
09/05/01 22:48:07
>>357
メモリ操作オンリーの計算なら止めてしまっても問題ないと思うが
普通にいろいろなリソースを操作しているなら勝手なタイミングで止められたらマズくね?
もちろん上記のような特殊な状況があるならそれこそSuspendしちまっても全然問題ないと思われますけど。
普通の状況では、イベントを確認して問題なければそこで止める。

360:デフォルトの名無しさん
09/05/01 23:04:40
Sleepする前にInterruptされていたら停まらないでThreadInterruptedException起こすし
問題ないかを確認するのはInterruptする側でしろということじゃないかな。

361:デフォルトの名無しさん
09/05/01 23:07:19
なんつーか、AbortにしてもInterruptにしても、これらの操作はスレッドに対する最終手段だぜ
普通に使うものじゃない

362:デフォルトの名無しさん
09/05/01 23:09:02
同期を使わないなんてアリエナイ。


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