C♯, C#相談室 Part34
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/09/06(水) 22:34:17前スレ
C♯, C#相談室 Part33
http://pc8.2ch.net/test/read.cgi/tech/1153537081/l50
過去スレは>>2-5あたり。
※スレタイに「#」を入れても消えちゃうので新スレ立てる人は要注意だ。
0951デフォルトの名無しさん
2006/10/29(日) 20:27:16コンストラクタでcontainerを引数にとるやつを削除したとき、
ほかで要求してない場合消えるみたいだな
0952デフォルトの名無しさん
2006/10/30(月) 02:54:11そのユーザコントロール上にはりつけたコンボボックスの幅を
ユーザコントロールのプロパティとして設定したいと思っています。
なので簡単にhogeWidthみたいなプロパティをつくってやって、
ユーザコントロール上にはりつけたコンボボックスの幅の値をかえられる
プロパティを作ってやりました。
やってることは単純に幅に値をセット、リターンしているだけ。
なんですが・・・・・・
デザイナでそのプロパティを設定したら
画面再読み込み時になぜか幅とかが毎回一定数プラスされた幅に変更されているのです。
たとえば100にすると116、みたいな。
プログラム内をのぞいてみても思い当たる節がなく、わけがわかりません。
つたない文章ですが、どなたが原因がわかる方、教えてください。
0954952
2006/10/30(月) 03:47:09イニシャライズ時にはプロパティで設定した値ではなく
初期値で表示されるので、直接値を設定するのではなく
メンバ変数に一度幅を格納してあげて、
コントロールロード時に、設定してあげるとうまくいきました。
newされた時はそりゃプロパティの設定値なんてわかんないですよね。・。
よく考えたら当たり前のことでした。
0955デフォルトの名無しさん
2006/10/30(月) 04:45:48ネイティブコード(Windowsバイナリ)を吐けるんですか?
0956デフォルトの名無しさん
2006/10/30(月) 04:51:16ngen.exe
0957デフォルトの名無しさん
2006/10/30(月) 05:19:52どうも。これって、.Netコードをネイティブに変換みたいですね。
少し読んでみても書いてなかったんですが、変換してネイティブコード生成しても、
やっぱり.Netランタイム(CLR)は必要なんですか?
0958デフォルトの名無しさん
2006/10/30(月) 05:23:29当然。しかしランタイムもngenに掛ける事が出来る。
0959デフォルトの名無しさん
2006/10/30(月) 05:34:130960デフォルトの名無しさん
2006/10/30(月) 11:50:35フォームの中で重い処理をするのはフォームの監視ループとかの関係であまりよろしくない
のでしょうか?
フォームで重い処理をする部分のパラメータを受け取ってその処理をスレッドとして動かし
ているのですがやたらと重いです。プログラムが応答しなくなるほどに。
以前、フォーム無しでやったときはこんな状態にはならなかったのですが、どなたか原因や
解決方法を教えていただけないでしょうか?
0961デフォルトの名無しさん
2006/10/30(月) 12:30:05フォームだろうがなかろうが重いのは重いだろうが。
どうせ処理の度に描画させてるんだろ?
0962デフォルトの名無しさん
2006/10/30(月) 12:33:27スレッド呼び出してそれは、フォームのコントロールを使ってるとかだったりして。
0963デフォルトの名無しさん
2006/10/30(月) 12:38:15スレッドの使い方を・・・
0964デフォルトの名無しさん
2006/10/30(月) 12:38:190965960
2006/10/30(月) 12:45:57スレッドの使い方は
Thread mainThread = new Thread(new ThreadStart(program.Run));
mainThread.Start();
this.Enabled = false;
mainThread.Join();
という感じです。
このprogram.Runが重い処理なのですが、GUI無しならフリーズするまでは
行かないのですが何故なんでしょう。
0966デフォルトの名無しさん
2006/10/30(月) 12:47:170967デフォルトの名無しさん
2006/10/30(月) 12:49:25というわけでスレッドの使い方を(ry
0968960
2006/10/30(月) 12:54:04確かに。他にもフォームを呼ぶ予定だったのでスレッド化したものなので
とりあえずスレッドをやめてみても何も変化無しでした。
フォ−ムを利用することによって何か別の負荷がかかることは無いんでしょうか。
0969デフォルトの名無しさん
2006/10/30(月) 13:01:58965のように計算処理に専念してしまってメッセージを処理しないUIスレッド(フォームを持つもの)があると、
他のプロセスやら何やら(主にExplorer)がウィンドウをあれこれしようとしたときにメッセージを送ったときに
待たされたりしていろいろと面倒なことが起きる。
あれこれdisableしてcancelボタンだけenableする、あるいは全部disableするなどしたのち、
Start で開始して、先方のスレッドの最後で form のメソッドを invoke して完了を通知、
そこで計算終了時のUIの設定にする、というのがいいと思う。
計算途中で時々 Progress() (←自作関数ね) とかを invoke して進行状況を UI 表示してもいいし、
適当な変数に進行状況を記録しておいてタイマーでUIに反映させるのもいいかもしれない。
0970960
2006/10/30(月) 13:17:51ありがとうございます。
>あれこれdisableしてcancelボタンだけenableする、あるいは全部disableする
this.Enabled = false;
だけでは不十分でしょうか?
0971デフォルトの名無しさん
2006/10/30(月) 13:32:37十分です。
でも長い計算はキャンセルできるようにしておくのが武士の情けというか・・・
0972960
2006/10/30(月) 13:38:20わかりました。
ありがとうございました。
0973デフォルトの名無しさん
2006/10/30(月) 13:40:27>先方のスレッドの最後で form のメソッドを invoke して完了を通知、
このメソッドの中で計算スレッドを Join しようとするとデッドロックなので注意。
先方のスレッドはInvoke経由でメソッドからの戻りを待っているから、完了しない。
0974デフォルトの名無しさん
2006/10/30(月) 18:03:290975デフォルトの名無しさん
2006/10/30(月) 19:07:07VisualStudio2005 C#でunsafeなコードやDLLを使わずにプログラムを作っているんですが、
WindowsXP自体がフリーズしてしまいます。
発生タイミングが一致せずいきなりフリーズしてしまうので
どこでおかしなことしているのか見当がつかないのです。
フリーズに至るまでには、まず自分で作ったプログラムのフォームが
フリーズします(普通は必ず文字が流れるとかして動いている)。
この時点でマウスは動くけど他のウインドウをクリックして
アクティブにしようよしてもなかなか変わらなくなって、
何回かクリックしてるとマザボのスピーカからビープ音が鳴ってOSごとフリーズ。
マウスも動かないしキーボードのNumLockも切り替わらなくなる。
でもそのPCで再生していたMP3は普通に再生されている
という状態になるのですが、何が考えられるでしょうか・・・
0976デフォルトの名無しさん
2006/10/30(月) 19:10:56ボタン押したら無限ループに突入するような WindowsApplication を作って、比較実験。
0977デフォルトの名無しさん
2006/10/30(月) 19:14:21・スレッドをどんどん作る
・メモリをどんどん確保して開放しない
このどちらかで簡単にそういう症状を起こせますよ
0978デフォルトの名無しさん
2006/10/30(月) 20:19:56・ウィルスチェック、ディスクチェック、メモリチェックをして、回線を外してアンチウィルス等の常在ソフトを終了してから、
1.問題が発生する最小限のソースを調べる
2.VisualStudio上の場合、そうでない場合で比較
3.DebugかReleaseかで比較
0979975
2006/10/30(月) 20:29:51>>976,977
フォームだけがフリーズするよね!多分!
なのでスレッドを作ってます。けどスレッドの中のループでスレッドを作る
とか無限にスレッドが生成されるようなことはしてないです
>>978
これが他のどのPCでも発生するからウイルス云々ではないと思います。
他の点についてはまた毎日やってみて確認してみます。
たまーにしかでないから余計に追跡しにくいんです><
0980デフォルトの名無しさん
2006/10/30(月) 20:34:260981デフォルトの名無しさん
2006/10/30(月) 20:56:010982デフォルトの名無しさん
2006/10/30(月) 21:08:04976は、GUIスレッドでビジーループを回すと、CPU資源が食い尽くされて、システム全体の
GUIの反応が悪くなる/停まるってことをいってるんだが。
多分、じゃなくて試してみるよろし。
同じ症状なら、お前のプログラムでもビジーループが発生している。
ビジーループ=while(true) {}な。一応。
0983デフォルトの名無しさん
2006/10/31(火) 18:22:13どうしたらいいでしょうか?
private int printingPosition;
private void printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
printingPosition = 0;
}
private int GetLengthForPrint(string text, int start, Font font, System.Drawing.Printing.PrintPageEventArgs e, StringFormat format)
{
int min = 0, max = text.Length - start;
float targetHeight = (float)e.MarginBounds.Height;
if (!(e.Graphics.MeasureString(text.Substring(start, max), font, e.MarginBounds.Width, format).Height > targetHeight))
return max;
while (min + 1 < max)
if (e.Graphics.MeasureString(text.Substring(start, (min + max) / 2), font, e.MarginBounds.Width, format).Height > targetHeight)
max = (min + max) / 2;
else
min = (min + max) / 2;
return min;
}
private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
StringFormat format = StringFormat.GenericTypographic;
int length = GetLengthForPrint(textMain.Text, printingPosition, textMain.Font, e, format);
e.Graphics.DrawString(textMain.Text.Substring(printingPosition, length), textMain.Font, Brushes.Black, e.MarginBounds, format);
printingPosition += length;
if (printingPosition >= textMain.Text.Length)
e.HasMorePages = false;
else
e.HasMorePages = true;
}
0984デフォルトの名無しさん
2006/11/01(水) 00:04:13うまくいかないって言われてもなぁ・・・
0985デフォルトの名無しさん
2006/11/01(水) 00:23:40ようはない
0986デフォルトの名無しさん
2006/11/01(水) 00:32:160987デフォルトの名無しさん
2006/11/01(水) 01:38:020988デフォルトの名無しさん
2006/11/01(水) 01:47:020989デフォルトの名無しさん
2006/11/01(水) 01:48:22いるのですが、【半角カナ】がASCII文字として含まれている場合に
プログラム内部で文字化けしてしまいます。
ぐぐって、一度そのファイルをUnicodeとして保存すれば(一時的に)解決
出来る事は分かったのですが、その様に手動でやるのでは無くプログラム内部
からファイル全体(文字単位では無く)をASCII → Unicode に変更
するにはどうすれば良いですか?
0991デフォルトの名無しさん
2006/11/01(水) 02:14:06> 【半角カナ】がASCII文字として含まれている
意味が分からん。
取りあえず StreamReader のコンストラクタ調べれ。
0992デフォルトの名無しさん
2006/11/01(水) 02:20:490993990
2006/11/01(水) 02:38:34>>>990
>> 【半角カナ】がASCII文字として含まれている
>意味が分からん。
>取りあえず StreamReader のコンストラクタ調べれ。
例えば、【ABC.txt】より1行ずつデータを取得する際に
StreamReaderにて半角カナが含まれる行を読み込もうとしたところ
そのファイル(ABC.txt)がASCIIコードとして保存されているが
為に半角カナ部分が文字化けしてしまっている状態です。
(例:ア → a)
※そのファイルを開き、Unicodeとして保存すると文字化けは無くなるので
すが、プログラムで自動化させたいのです。
0994デフォルトの名無しさん
2006/11/01(水) 03:09:04StreamReaderのコンストラクタでエンコード指定できるでしょ。
0995デフォルトの名無しさん
2006/11/01(水) 03:11:58文字コードの変換は、StreamReaderで読み込んで、StreamWriterで書き出すだけ。
0996デフォルトの名無しさん
2006/11/01(水) 08:00:340998デフォルトの名無しさん
2006/11/01(水) 15:49:270999デフォルトの名無しさん
2006/11/01(水) 15:52:411000デフォルトの名無しさん
2006/11/01(水) 15:57:0510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。