ふらっとC#,C♯,C#(初心者用) Part24
952 :
945:2008/02/26(火) 17:31:59
各位いろいろどーも。
>>948 ちょっとネタがそれてしまってスマソ。
もともとの「木構造に適したコレクションの有無」ならスレ違いじゃないよね。
>>949 おお、サンクス。日本語ページのみにしてたから気づかなかったよ。
てかcode projectには会員登録してるのにすっかり忘れてた。
使ってみるか、参考にしてみるよ。
そもそもList<T>等を入れ子にして、
>>945に書いた程度の機能が欲しかった
だけなんだが、利便性とかも含めいろいろ考えると確かに複雑というか太る。
DOMまで行かなくてもどこかにベースになるような物があるんだろうよ。と思ったのが発端。
>>950 検索はしたいけどそれが主体な検索木が必要だと言うことではないんです。
>>953 フォームを透明にしたいのですが、
リージョンウィンドウは重いと聞いたので・・・
聞いたのでってw
ROK
聞いたので、の何が悪いんだろうね
>>955みたいなのはなんなんだろう?
今時の子は人に聞いたりとかってもんを軽視してるしな
それしかなかった時代が存外身近なのにもかかわらず
聞くのはいいが、その裏付けを取れよ。
マニュアルを見て、また実際にプログラム書いてみればすぐわかるんだから。
パフォーマンス云々を気にするならまずやってみろってこったよ
確かにFormを透明にすると重くなると思います。
ただスペックによると思いますので、自分のPCでいけるといって顧客環境ではいけるとは限らないでしょう。逆も然り
backgroundWorkerについて質問です
以下定義
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.WorkerSupportsCancellation = true;
普通にバックグラウンド処理(backgroundWorker1_DoWork)の処理が終わり
backgroundWorker1_RunWorkerCompletedが呼び出され終了した場合は全く問題ないのですが
backgroundWorker1.CancelAsync();によりキャンセルをした場合に限り、次にまたbackgroundWorker1_DoWorkを
呼び出した場合正常に動作しません(バックグラウンド処理が全く始まらないです)
これは何か定義を忘れているのでしょうか?情報不足な場合申し訳ないです、言っていただきたいです
ボタンをクリック→バックグランド処理→終了→ボタンをクリック→バックグランド処理→…だと正常
ボタンをクリック→バックグランド処理→バックグランド処理中にキャンセルボタンでキャンセル→ボタンをクリック→バックグランド処理(始まらない)
こんな感じです
よろしくお願いします
963 :
963:2008/02/27(水) 03:46:40
すみません、原因がわかったと同時に問題がorz
backgroundWorker_DoWork内で主要処理を別メソッドとして書いています
つまり別メソッドなのでbackgroundWorker1.CancellationPendingを参照出来ません
DoWork内に主要処理をしっかり書くしかないというのは不便な気もしますし、しょうがないところなのかなとも思うのですが
何か対応策ないでしょうか?
設計を見直すしかないでしょうか?
964 :
963:2008/02/27(水) 03:47:02
名前欄間違えました963=962です
backgroundWorker_DoWork(なんだったか引数)
{
func();
}
こんな感じでfuncに主要処理が書かれてるってこと?
966 :
962:2008/02/27(水) 03:54:13
>>965 そうです、正確にはbackground_DoWork内で状況に応じて呼び出すメソッドを変えています
backgroundWorker_DoWork(略)
{
switch(type)
{
case 1: func1();
case 2: func2();
case 3: func3();
:
default: break;
}
}
ニュアンスとしてはこんな感じです
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にアクセス出来る
}
}
C#の勉強をかねて非矩形のウインドウを作ろうと思ってとりあえず形にはなったんだけど
ウインドウサイズを変更する際に目に見えて遅くなるのは実装がまずいんだろうか?
今の実装は、枠消したFormにベースとなる画像を張りつけといて
その上で、張った画像の透過部分以外を囲むGraphicsPathを書いてそれでFormをくりぬく様にしてる
1byteをintに変換するのにはどうすればよいですか?
int ret = BitConverter.ToInt16( value,0 ) ;
見たいにやると例外で落ちてしまいました。
キャストでええやん
そっか普通にキャストでよかったんですね
有難う御座います
972 :
デフォルトの名無しさん:2008/02/27(水) 09:53:42
複数のスレッドが走っている際のTcpListenerの反応が鈍くて困ってます。
・コマンド受信用のThread x1(TcpListenerでテキスト1行のコマンドを待ち受け)
・データ処理用のThread x4(数字ごにょごにょしているだけ)
Main()
{
ListenerThread();
DataConvertThread();
}
となっているのですが、データ処理用のThreadが走っている間、TcpListenerの
AcceptSocketが発生してくれません。
処理すべきデータを切り替えたりするコマンドを受信した際に、イベントを発生させ、
データ処理用のThreadを止めて新たに作り直したいのですが、処理が終わるまで
反応してくれないのです。
どうしたらいいでしょうか?
>>972 で,実際の中身はどうなってるの?
擬似コードは全く役に立たないよ
Dictionary<string, string[]> list = new Dictionary<string, string[]>();
キーの一覧を取りたいのですがstring[] lists = list.Keysだと暗黙の変換が出来ないと怒られるのですが
どうしたら良いのでしょうか?
Keysの型がなんでstring[]だと思ったのかkwsk
>>975 これでキーが取れたから(^^;
foreach (string key in list)
{
}
MSDN で Dictionary<TKey, TValue>.Keys プロパティ調べれ
>>974 仕方ないから教えてやるけど、次からちゃんとMSDN読めよ。
MSDNが難しかったらオブジェクトブラウザでもいいし。
string str0 = list.Keys[0]
string str1 = list.Keys[1]
要するにそのまま取り出せばいい。
一度変数に格納したい場合は
Dictionary<string,string[]>.KeyCollection keyList = list.Keys;
このように書く。
コレクションの概念とクラスと型の概念の勉強からやり直しなさい。
>>976 foreach()で列挙可能なのは配列型だけじゃないぞ
長いことやっててその状態なら慢性勉強不足気味
そうでなくとも原因を特定できないようじゃ結構キツイ
というわけでおれもMSDNをオメヌメ
コレクションの概念おしえてください(^^;
>>980 MethodInvoker inv;
は引数も戻り値も取らないデリゲート
Func<int,bool>
は引数にint、戻り値にboolをとるデリゲート
これは分かるのだが、
引数にint、戻り値なしというようなジェネリックデリゲートって用意されてない?
Func<int,void>
Func<MyClass,void>
みたいなものを使いたいんだが、見つけられないんだ。
今は仕方ないからboolを返すようにして、常にtrueを返すようにしてFunc<MyClass,bool>を使ってる。
戻り値いらないから、毎回boolを返さなきゃいけないのが面倒なんだよね。
Action
俺のコレクションは美少女物が少々
だが俺に何かあったときはこっそり処分して貰いたい
ファイナライザを実装しとけばおk
実行してくれるGCはどうするよ
みなさん、ありがとうございます。
MSDNも見てきました。
>> Dictionary<string,string[]>.KeyCollection keyList = list.Keys;
単にコピーするというのではなくこの行がとてもわかりやすかったです。
988 :
981: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 お礼として次スレを建ててもらえるとありがたい
他の人、立候補よろ
>>988 立てれなかった(^^;)残念
990 :
988:2008/02/27(水) 14:18:24
自己解決しますた。
引数の渡し方の問題じゃなくて、呼び出し先のメソッドでポカやってたみたい。
渡し方は、
Invoke(TestInvoker,new Object[] {param});
で問題ないみたいだね。失礼しました。
new object[]{...}
object[]が要求されてるなら素直にobject[]を渡せよと。
あと共変性って言葉を調べるといい。
992 :
988:2008/02/27(水) 14:38:21
>>991 悪いけどそんなもんは当然分かってる。
>>988で
>Invoke(TestInvoker,new Object {param});
と書いているのは単に[]を付け忘れただけだ。
問題だったのは呼び出し先デリゲート内の処理の方だったし、
それは自己解決したって言ってるだろ?
自己解決したっていうレスにわざわざ突っ込み入れるなんて、
いちいち追い打ちで人を貶して優越感に浸ることしかできないのか?
993 :
デフォルトの名無しさん:2008/02/27(水) 14:41:18
3行以上よめません><
要するに「はいはい」ってことですか><; わかりません!
くだらねえ
日本語が不自由すぎる
他の掲示板で質問をすると、大抵手ひどい対応をされるわけだが、このスレの人はなんで親切揃いばっかりなのは何故だぜ?
それに対して逆ギレするとはアホすぎるw
>>992 あなたさまはどこのおぼっちゃまですか?
ラムダ式について質問です。
Form OwnerForm = frm1
//frm1を表示させる
OwnerForm.Invoke((Action)delegate() { OwnerForm.Show(); });
この匿名メソッドをラムダ式を使って表記したい場合どのような感じになりますか?
OwnerForm.Invoke(new Action(() => OwnerForm.Show()));
>>999 ありがとう。
なるほど普通に匿名メソッドで表記した方が可読性が良いですね。
今回は匿名メソッドで表記することにします。
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。