トップページ⇒tech
1001コメント315KB

C♯, C#相談室 Part34

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2006/09/06(水) 22:34:17
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C♯, C#相談室 Part33
http://pc8.2ch.net/test/read.cgi/tech/1153537081/l50

過去スレは>>2-5あたり。
※スレタイに「#」を入れても消えちゃうので新スレ立てる人は要注意だ。
0951デフォルトの名無しさん2006/10/29(日) 20:27:16
TimerとかContextMenuStripとか、
コンストラクタでcontainerを引数にとるやつを削除したとき、
ほかで要求してない場合消えるみたいだな
0952デフォルトの名無しさん2006/10/30(月) 02:54:11
コンボボックスのユーザコントロールを作成しています。
そのユーザコントロール上にはりつけたコンボボックスの幅を
ユーザコントロールのプロパティとして設定したいと思っています。

なので簡単にhogeWidthみたいなプロパティをつくってやって、
ユーザコントロール上にはりつけたコンボボックスの幅の値をかえられる
プロパティを作ってやりました。

やってることは単純に幅に値をセット、リターンしているだけ。

なんですが・・・・・・

デザイナでそのプロパティを設定したら
画面再読み込み時になぜか幅とかが毎回一定数プラスされた幅に変更されているのです。
たとえば100にすると116、みたいな。

プログラム内をのぞいてみても思い当たる節がなく、わけがわかりません。
つたない文章ですが、どなたが原因がわかる方、教えてください。

09539452006/10/30(月) 03:46:41
>>951
再現しました。確かにそのようです。わざわざお手数おかけしました。
09549522006/10/30(月) 03:47:09
すいません、自己解決しました。
イニシャライズ時にはプロパティで設定した値ではなく
初期値で表示されるので、直接値を設定するのではなく
メンバ変数に一度幅を格納してあげて、

コントロールロード時に、設定してあげるとうまくいきました。
newされた時はそりゃプロパティの設定値なんてわかんないですよね。・。
よく考えたら当たり前のことでした。

0955デフォルトの名無しさん2006/10/30(月) 04:45:48
C#で、Netコードを吐くんじゃなくて、
ネイティブコード(Windowsバイナリ)を吐けるんですか?
0956デフォルトの名無しさん2006/10/30(月) 04:51:16
>>955
ngen.exe
0957デフォルトの名無しさん2006/10/30(月) 05:19:52
>>956
どうも。これって、.Netコードをネイティブに変換みたいですね。
少し読んでみても書いてなかったんですが、変換してネイティブコード生成しても、
やっぱり.Netランタイム(CLR)は必要なんですか?
0958デフォルトの名無しさん2006/10/30(月) 05:23:29
>>957
当然。しかしランタイムもngenに掛ける事が出来る。
0959デフォルトの名無しさん2006/10/30(月) 05:34:13
なるほど。
0960デフォルトの名無しさん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
>>962
スレッドの使い方を・・・
0964デフォルトの名無しさん2006/10/30(月) 12:38:19
FillRectangleはRectangleとRectangleFを受け付けてDrawRectangleはRectangleしか受け付けないのは自分が悪いんですか?(・ω・)
09659602006/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:17
そこ Join で待つならスレッド作る意味ゼロじゃないか?
0967デフォルトの名無しさん2006/10/30(月) 12:49:25
>>965
というわけでスレッドの使い方を(ry
09689602006/10/30(月) 12:54:04
>>966
確かに。他にもフォームを呼ぶ予定だったのでスレッド化したものなので
とりあえずスレッドをやめてみても何も変化無しでした。
フォ−ムを利用することによって何か別の負荷がかかることは無いんでしょうか。
0969デフォルトの名無しさん2006/10/30(月) 13:01:58
>>968
965のように計算処理に専念してしまってメッセージを処理しないUIスレッド(フォームを持つもの)があると、
他のプロセスやら何やら(主にExplorer)がウィンドウをあれこれしようとしたときにメッセージを送ったときに
待たされたりしていろいろと面倒なことが起きる。

あれこれdisableしてcancelボタンだけenableする、あるいは全部disableするなどしたのち、
Start で開始して、先方のスレッドの最後で form のメソッドを invoke して完了を通知、
そこで計算終了時のUIの設定にする、というのがいいと思う。

計算途中で時々 Progress() (←自作関数ね) とかを invoke して進行状況を UI 表示してもいいし、
適当な変数に進行状況を記録しておいてタイマーでUIに反映させるのもいいかもしれない。
09709602006/10/30(月) 13:17:51
>>969
ありがとうございます。

>あれこれdisableしてcancelボタンだけenableする、あるいは全部disableする
this.Enabled = false;
だけでは不十分でしょうか?
0971デフォルトの名無しさん2006/10/30(月) 13:32:37
>>970
十分です。
でも長い計算はキャンセルできるようにしておくのが武士の情けというか・・・
09729602006/10/30(月) 13:38:20
>>971
わかりました。
ありがとうございました。
0973デフォルトの名無しさん2006/10/30(月) 13:40:27
老婆心からの蛇足だが、
>先方のスレッドの最後で form のメソッドを invoke して完了を通知、

このメソッドの中で計算スレッドを Join しようとするとデッドロックなので注意。
先方のスレッドはInvoke経由でメソッドからの戻りを待っているから、完了しない。
0974デフォルトの名無しさん2006/10/30(月) 18:03:29
BackgroundWorker 超便利
0975デフォルトの名無しさん2006/10/30(月) 19:07:07
質問。

VisualStudio2005 C#でunsafeなコードやDLLを使わずにプログラムを作っているんですが、
WindowsXP自体がフリーズしてしまいます。

発生タイミングが一致せずいきなりフリーズしてしまうので
どこでおかしなことしているのか見当がつかないのです。

フリーズに至るまでには、まず自分で作ったプログラムのフォームが
フリーズします(普通は必ず文字が流れるとかして動いている)。
この時点でマウスは動くけど他のウインドウをクリックして
アクティブにしようよしてもなかなか変わらなくなって、
何回かクリックしてるとマザボのスピーカからビープ音が鳴ってOSごとフリーズ。
マウスも動かないしキーボードのNumLockも切り替わらなくなる。
でもそのPCで再生していたMP3は普通に再生されている

という状態になるのですが、何が考えられるでしょうか・・・
0976デフォルトの名無しさん2006/10/30(月) 19:10:56
>>975
ボタン押したら無限ループに突入するような WindowsApplication を作って、比較実験。
0977デフォルトの名無しさん2006/10/30(月) 19:14:21
>>975
・スレッドをどんどん作る
・メモリをどんどん確保して開放しない

このどちらかで簡単にそういう症状を起こせますよ
0978デフォルトの名無しさん2006/10/30(月) 20:19:56
・β版の.NET Frameworkでないか確認
・ウィルスチェック、ディスクチェック、メモリチェックをして、回線を外してアンチウィルス等の常在ソフトを終了してから、
1.問題が発生する最小限のソースを調べる
2.VisualStudio上の場合、そうでない場合で比較
3.DebugかReleaseかで比較
09799752006/10/30(月) 20:29:51
みなさん、本当にありがとうございます。

>>976,977
フォームだけがフリーズするよね!多分!
なのでスレッドを作ってます。けどスレッドの中のループでスレッドを作る
とか無限にスレッドが生成されるようなことはしてないです

>>978
これが他のどのPCでも発生するからウイルス云々ではないと思います。
他の点についてはまた毎日やってみて確認してみます。

たまーにしかでないから余計に追跡しにくいんです><
0980デフォルトの名無しさん2006/10/30(月) 20:34:26
ソース晒せ
0981デフォルトの名無しさん2006/10/30(月) 20:56:01
晒せ
0982デフォルトの名無しさん2006/10/30(月) 21:08:04
>>979
976は、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
>>983
うまくいかないって言われてもなぁ・・・
0985デフォルトの名無しさん2006/11/01(水) 00:23:40
この程度のちいさなソース見てうまく行かない点を指摘できないやつに
ようはない
0986デフォルトの名無しさん2006/11/01(水) 00:32:16
そんなお前もお呼びでない
0987デフォルトの名無しさん2006/11/01(水) 01:38:02
ああこれはだめだね
0988デフォルトの名無しさん2006/11/01(水) 01:47:02
GetTypeで得られた型にキャストするにはどうすればいいのからしらん?
0989デフォルトの名無しさん2006/11/01(水) 01:48:22
キャストは静的なものなのに動的にどうこうできるわけが無かろう
0990 2006/11/01(水) 02:10:13
テキストファイルからStreamReaderを使用し文字列を読み込んで
いるのですが、【半角カナ】がASCII文字として含まれている場合に
プログラム内部で文字化けしてしまいます。

ぐぐって、一度そのファイルをUnicodeとして保存すれば(一時的に)解決
出来る事は分かったのですが、その様に手動でやるのでは無くプログラム内部
からファイル全体(文字単位では無く)をASCII → Unicode に変更
するにはどうすれば良いですか?
0991デフォルトの名無しさん2006/11/01(水) 02:14:06
>>990
> 【半角カナ】がASCII文字として含まれている
意味が分からん。
取りあえず StreamReader のコンストラクタ調べれ。
0992デフォルトの名無しさん2006/11/01(水) 02:20:49
yahooじゃダメですか?
09939902006/11/01(水) 02:38:34
>>991
>>>990
>> 【半角カナ】がASCII文字として含まれている
>意味が分からん。
>取りあえず StreamReader のコンストラクタ調べれ。
例えば、【ABC.txt】より1行ずつデータを取得する際に
StreamReaderにて半角カナが含まれる行を読み込もうとしたところ
そのファイル(ABC.txt)がASCIIコードとして保存されているが
為に半角カナ部分が文字化けしてしまっている状態です。
(例:ア → a)

※そのファイルを開き、Unicodeとして保存すると文字化けは無くなるので
すが、プログラムで自動化させたいのです。
0994デフォルトの名無しさん2006/11/01(水) 03:09:04
>>993
StreamReaderのコンストラクタでエンコード指定できるでしょ。
0995デフォルトの名無しさん2006/11/01(水) 03:11:58
>>993
文字コードの変換は、StreamReaderで読み込んで、StreamWriterで書き出すだけ。
0996デフォルトの名無しさん2006/11/01(水) 08:00:34
asciiなのに半角カナとはこれいかに
09979902006/11/01(水) 08:24:44

>>994,995
どうもありがとうございます!!!
助かりました。皆さんホントお詳しいですね。
私もそのスキルに近づきたいものです。
0998デフォルトの名無しさん2006/11/01(水) 15:49:27
1000とったら1000千億プレゼント
0999デフォルトの名無しさん2006/11/01(水) 15:52:41
999なら1000を他人に取られる
1000デフォルトの名無しさん2006/11/01(水) 15:57:05
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。