ふらっとC#,C♯,C#(初心者用) Part24

このエントリーをはてなブックマークに追加
952945:2008/02/26(火) 17:31:59
各位いろいろどーも。

>>948
ちょっとネタがそれてしまってスマソ。
もともとの「木構造に適したコレクションの有無」ならスレ違いじゃないよね。

>>949
おお、サンクス。日本語ページのみにしてたから気づかなかったよ。
てかcode projectには会員登録してるのにすっかり忘れてた。
使ってみるか、参考にしてみるよ。

そもそもList<T>等を入れ子にして、>>945に書いた程度の機能が欲しかった
だけなんだが、利便性とかも含めいろいろ考えると確かに複雑というか太る。
DOMまで行かなくてもどこかにベースになるような物があるんだろうよ。と思ったのが発端。

>>950
検索はしたいけどそれが主体な検索木が必要だと言うことではないんです。
953デフォルトの名無しさん:2008/02/26(火) 19:55:50
>>951
なんじゃその分類法
954デフォルトの名無しさん:2008/02/26(火) 19:58:49
>>953
フォームを透明にしたいのですが、
リージョンウィンドウは重いと聞いたので・・・
955デフォルトの名無しさん:2008/02/26(火) 20:04:06
聞いたのでってw
956デフォルトの名無しさん:2008/02/26(火) 22:43:04
ROK
957デフォルトの名無しさん:2008/02/26(火) 23:02:23
聞いたので、の何が悪いんだろうね>>955みたいなのはなんなんだろう?
958デフォルトの名無しさん:2008/02/26(火) 23:03:07
今時の子は人に聞いたりとかってもんを軽視してるしな
それしかなかった時代が存外身近なのにもかかわらず
959デフォルトの名無しさん:2008/02/26(火) 23:08:05
聞くのはいいが、その裏付けを取れよ。
マニュアルを見て、また実際にプログラム書いてみればすぐわかるんだから。
960デフォルトの名無しさん:2008/02/26(火) 23:24:06
パフォーマンス云々を気にするならまずやってみろってこったよ
961デフォルトの名無しさん:2008/02/27(水) 00:03:21
確かにFormを透明にすると重くなると思います。
ただスペックによると思いますので、自分のPCでいけるといって顧客環境ではいけるとは限らないでしょう。逆も然り
962デフォルトの名無しさん:2008/02/27(水) 03:16:08
backgroundWorkerについて質問です
以下定義
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.WorkerSupportsCancellation = true;

普通にバックグラウンド処理(backgroundWorker1_DoWork)の処理が終わり
backgroundWorker1_RunWorkerCompletedが呼び出され終了した場合は全く問題ないのですが
backgroundWorker1.CancelAsync();によりキャンセルをした場合に限り、次にまたbackgroundWorker1_DoWorkを
呼び出した場合正常に動作しません(バックグラウンド処理が全く始まらないです)

これは何か定義を忘れているのでしょうか?情報不足な場合申し訳ないです、言っていただきたいです

ボタンをクリック→バックグランド処理→終了→ボタンをクリック→バックグランド処理→…だと正常
ボタンをクリック→バックグランド処理→バックグランド処理中にキャンセルボタンでキャンセル→ボタンをクリック→バックグランド処理(始まらない)

こんな感じです
よろしくお願いします
963963:2008/02/27(水) 03:46:40
すみません、原因がわかったと同時に問題がorz
backgroundWorker_DoWork内で主要処理を別メソッドとして書いています
つまり別メソッドなのでbackgroundWorker1.CancellationPendingを参照出来ません

DoWork内に主要処理をしっかり書くしかないというのは不便な気もしますし、しょうがないところなのかなとも思うのですが
何か対応策ないでしょうか?

設計を見直すしかないでしょうか?
964963:2008/02/27(水) 03:47:02
名前欄間違えました963=962です
965デフォルトの名無しさん:2008/02/27(水) 03:51:17
backgroundWorker_DoWork(なんだったか引数)
{
 func();
}
こんな感じでfuncに主要処理が書かれてるってこと?
966962:2008/02/27(水) 03:54:13
>>965
そうです、正確にはbackground_DoWork内で状況に応じて呼び出すメソッドを変えています
backgroundWorker_DoWork(略)
{
 switch(type)
 {
  case 1: func1();
  case 2: func2();
  case 3: func3();
   :
  default: break;
 }
}
ニュアンスとしてはこんな感じです
967デフォルトの名無しさん:2008/02/27(水) 06:52:17
backgroundWorker1(オブジェクト)とbackgroundWorker1_DoWorkとfunc1,2,3が
同じスコープにあるなら、何も問題ないと思うが

デリゲートの概念はきちんと理解してるんだろう


推測するに、かなり省略したけどこんな感じじゃないのか

class Form1 {
 BackgoundWorker bgWorker1;

 void InitializeComponent() {
  this.bgWorker1.DoWork += new 〜(this.bgWork1_DoWork);
 }

 void bgWorker1_DoWork(〜) {
  func1();
  // this.bgWorker1にアクセス出来る
 }

 void func1() {
  // this.bgWorker1にアクセス出来る
 }
}
968デフォルトの名無しさん:2008/02/27(水) 07:20:35
C#の勉強をかねて非矩形のウインドウを作ろうと思ってとりあえず形にはなったんだけど
ウインドウサイズを変更する際に目に見えて遅くなるのは実装がまずいんだろうか?
今の実装は、枠消したFormにベースとなる画像を張りつけといて
その上で、張った画像の透過部分以外を囲むGraphicsPathを書いてそれでFormをくりぬく様にしてる
969デフォルトの名無しさん:2008/02/27(水) 08:06:43
1byteをintに変換するのにはどうすればよいですか?

int ret = BitConverter.ToInt16( value,0 ) ;

見たいにやると例外で落ちてしまいました。
970デフォルトの名無しさん:2008/02/27(水) 08:10:22
キャストでええやん
971デフォルトの名無しさん:2008/02/27(水) 08:18:49
そっか普通にキャストでよかったんですね
有難う御座います
972デフォルトの名無しさん:2008/02/27(水) 09:53:42
複数のスレッドが走っている際のTcpListenerの反応が鈍くて困ってます。

・コマンド受信用のThread x1(TcpListenerでテキスト1行のコマンドを待ち受け)
・データ処理用のThread x4(数字ごにょごにょしているだけ)
Main()
{
ListenerThread();
DataConvertThread();
}

となっているのですが、データ処理用のThreadが走っている間、TcpListenerの
AcceptSocketが発生してくれません。

処理すべきデータを切り替えたりするコマンドを受信した際に、イベントを発生させ、
データ処理用のThreadを止めて新たに作り直したいのですが、処理が終わるまで
反応してくれないのです。

どうしたらいいでしょうか?
973デフォルトの名無しさん:2008/02/27(水) 10:52:39
>>972
で,実際の中身はどうなってるの?
擬似コードは全く役に立たないよ
974デフォルトの名無しさん:2008/02/27(水) 11:19:56
Dictionary<string, string[]> list = new Dictionary<string, string[]>();
キーの一覧を取りたいのですがstring[] lists = list.Keysだと暗黙の変換が出来ないと怒られるのですが
どうしたら良いのでしょうか?
975デフォルトの名無しさん:2008/02/27(水) 11:35:14
Keysの型がなんでstring[]だと思ったのかkwsk
976デフォルトの名無しさん:2008/02/27(水) 11:38:27
>>975
これでキーが取れたから(^^;

foreach (string key in list)
{
}
977デフォルトの名無しさん:2008/02/27(水) 11:49:46
MSDN で Dictionary<TKey, TValue>.Keys プロパティ調べれ
978デフォルトの名無しさん:2008/02/27(水) 11:49:59
>>974
仕方ないから教えてやるけど、次からちゃんとMSDN読めよ。
MSDNが難しかったらオブジェクトブラウザでもいいし。

string str0 = list.Keys[0]
string str1 = list.Keys[1]

要するにそのまま取り出せばいい。
一度変数に格納したい場合は

Dictionary<string,string[]>.KeyCollection keyList = list.Keys;

このように書く。
コレクションの概念とクラスと型の概念の勉強からやり直しなさい。
979デフォルトの名無しさん:2008/02/27(水) 12:07:04
>>976
foreach()で列挙可能なのは配列型だけじゃないぞ
長いことやっててその状態なら慢性勉強不足気味
そうでなくとも原因を特定できないようじゃ結構キツイ

というわけでおれもMSDNをオメヌメ
980デフォルトの名無しさん:2008/02/27(水) 12:09:33
コレクションの概念おしえてください(^^;
981デフォルトの名無しさん:2008/02/27(水) 12:20:40
>>980
MethodInvoker inv;
は引数も戻り値も取らないデリゲート

Func<int,bool>
は引数にint、戻り値にboolをとるデリゲート

これは分かるのだが、

引数にint、戻り値なしというようなジェネリックデリゲートって用意されてない?
Func<int,void>
Func<MyClass,void>

みたいなものを使いたいんだが、見つけられないんだ。
今は仕方ないからboolを返すようにして、常にtrueを返すようにしてFunc<MyClass,bool>を使ってる。
戻り値いらないから、毎回boolを返さなきゃいけないのが面倒なんだよね。
982デフォルトの名無しさん:2008/02/27(水) 12:22:17
Action
983デフォルトの名無しさん:2008/02/27(水) 12:26:06
>>982
ありがd
984デフォルトの名無しさん:2008/02/27(水) 12:26:36
俺のコレクションは美少女物が少々
だが俺に何かあったときはこっそり処分して貰いたい
985デフォルトの名無しさん:2008/02/27(水) 12:30:19
ファイナライザを実装しとけばおk
986デフォルトの名無しさん:2008/02/27(水) 12:37:54
実行してくれるGCはどうするよ
987デフォルトの名無しさん:2008/02/27(水) 12:38:11
みなさん、ありがとうございます。
MSDNも見てきました。

>> Dictionary<string,string[]>.KeyCollection keyList = list.Keys;

単にコピーするというのではなくこの行がとてもわかりやすかったです。

988981:2008/02/27(水) 13:35:22
ついでにもう一つお願い。

Public Action<int[]> TestInvoker=TestMethod;
これがあって、このデリゲートをInvokeメソッドで呼びたい。
このときInvokeメソッドの第二引数にはObject[]を渡さなければいけないそうなんだけど、

int[] param = new int[] {0,1,2};

Invoke(TestInvoker,param);
これもダメ

Invoke(TestInvoker,new Object {param});
これもダメ

実行時エラーになってまう。
エラー内容はFormatExceptionの例外で、引数が不正っぽいニュアンス。

どこがダメだかご指摘くだされ。

>>987
お礼として次スレを建ててもらえるとありがたい
989デフォルトの名無しさん:2008/02/27(水) 13:44:07
他の人、立候補よろ

>>988
立てれなかった(^^;)残念
990988:2008/02/27(水) 14:18:24
自己解決しますた。
引数の渡し方の問題じゃなくて、呼び出し先のメソッドでポカやってたみたい。
渡し方は、
Invoke(TestInvoker,new Object[] {param});
で問題ないみたいだね。失礼しました。
991デフォルトの名無しさん:2008/02/27(水) 14:18:26
new object[]{...}
object[]が要求されてるなら素直にobject[]を渡せよと。
あと共変性って言葉を調べるといい。
992988:2008/02/27(水) 14:38:21
>>991
悪いけどそんなもんは当然分かってる。

>>988
>Invoke(TestInvoker,new Object {param});

と書いているのは単に[]を付け忘れただけだ。

問題だったのは呼び出し先デリゲート内の処理の方だったし、
それは自己解決したって言ってるだろ?

自己解決したっていうレスにわざわざ突っ込み入れるなんて、
いちいち追い打ちで人を貶して優越感に浸ることしかできないのか?

993デフォルトの名無しさん:2008/02/27(水) 14:41:18
3行以上よめません><
要するに「はいはい」ってことですか><; わかりません!
994デフォルトの名無しさん:2008/02/27(水) 14:41:55
くだらねえ
995デフォルトの名無しさん:2008/02/27(水) 14:42:20
日本語が不自由すぎる
996デフォルトの名無しさん:2008/02/27(水) 15:41:01
他の掲示板で質問をすると、大抵手ひどい対応をされるわけだが、このスレの人はなんで親切揃いばっかりなのは何故だぜ?
それに対して逆ギレするとはアホすぎるw
997デフォルトの名無しさん:2008/02/27(水) 15:47:47
>>992
あなたさまはどこのおぼっちゃまですか?
998デフォルトの名無しさん:2008/02/27(水) 15:53:00
ラムダ式について質問です。

Form OwnerForm = frm1
//frm1を表示させる
OwnerForm.Invoke((Action)delegate() { OwnerForm.Show(); });

この匿名メソッドをラムダ式を使って表記したい場合どのような感じになりますか?
999デフォルトの名無しさん:2008/02/27(水) 16:34:36
OwnerForm.Invoke(new Action(() => OwnerForm.Show()));
1000デフォルトの名無しさん:2008/02/27(水) 16:40:09
>>999
ありがとう。
なるほど普通に匿名メソッドで表記した方が可読性が良いですね。
今回は匿名メソッドで表記することにします。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。