C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C#についての質問


(過去ログ 125 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■74687 / inTopicNo.1)  C#についての質問
  
□投稿者/ ぽん吉 (3回)-(2015/01/22(Thu) 21:29:18)

分類:[C#] 

C#についての質問なのですが

System.Text.Encoding.GetEncoding(932).GetString(TargetByte2)

変換処理なのですが、この処理を何回もしているとformがフリーズしてしまいます。

どうすれば変換処理でフリーズしないようにできますでしょうか?
引用返信 編集キー/
■74689 / inTopicNo.2)  Re[1]: C#についての質問
□投稿者/ Azulean (416回)-(2015/01/22(Thu) 22:07:17)
No74687 (ぽん吉 さん) に返信
> System.Text.Encoding.GetEncoding(932).GetString(TargetByte2)
>
> 変換処理なのですが、この処理を何回もしているとformがフリーズしてしまいます。

このあたりをもう少し具体的なコードで示せませんか?

「単純に上記の一行を永遠にループしているとフリーズする」ということであれば、Windows アプリケーションとして自然なことです。
そうではなく、ループせずともフリーズするというのであれば、そのあたりの状況を書いて欲しいです。
たとえば、どんなバイト列なら起きるとか、再現させるための情報が欲しいところです。
引用返信 編集キー/
■74690 / inTopicNo.3)  Re[2]: C#についての質問
□投稿者/ ぽん吉 (4回)-(2015/01/23(Fri) 01:24:17)
バイナリデータを取得して文字列に変換しています。
タイマーをセットしていて、loopさせています。

loopさせててもフリーズしない方法とかありますでしょうか?

loopさせてなくても何回も処理をするとフリーズします。

どんなバイト列でもだいたいフリーズすると思います。
引用返信 編集キー/
■74691 / inTopicNo.4)  Re[3]: C#についての質問
□投稿者/ Azulean (417回)-(2015/01/23(Fri) 07:15:01)
No74690 (ぽん吉 さん) に返信
> バイナリデータを取得して文字列に変換しています。
> タイマーをセットしていて、loopさせています。
> loopさせててもフリーズしない方法とかありますでしょうか?

私が言ったループとは以下のようなイメージです。

while(true) {
  System.Text.Encoding.GetEncoding(932).GetString(TargetByte2);
}

この場合、メッセージループに戻らなくなるのでフリーズするのは自然ですが、こうではなく、タイマーによる秒単位での繰り返し、
つまり処理から抜けて 0.5 秒ぐらいは次の処理までに余裕がある状態と考えて相違ないでしょうか。


> loopさせてなくても何回も処理をするとフリーズします。
> どんなバイト列でもだいたいフリーズすると思います。

「思います」ではなくきちんと検証しましょう。
思い込みがよくないので、自分の考えが当たっているかどうかを新しく作ったプロジェクトで検証することは重要です。

また、デバッグ実行で「フリーズしたと思われる状態」に陥ったのであれば、Visual Studio のデバッグメニューからすべて中断を選び、
どこを実行しているのかを確認しつつ、ステップ実行でも進まないのかどうかを確認してください。
もし、遅くなっているだけで処理が進んでいるのであれば、なぜ遅くなっているかを調べてください。


なお、手元の Windows 8.1 Update (x64) 環境で以下のようなコードを実行すると 6 秒程度で終了しました。

static void Main(string[] args)
{
    var encoding = Encoding.GetEncoding(932);
    var TargetByte2 = encoding.GetBytes("日本語テスト");
    var sw = Stopwatch.StartNew();
    for (int i = 1; i <= 100000000; i++)
    {
        string s = encoding.GetString(TargetByte2);
    }
    Console.WriteLine(sw.Elapsed);
}

引用返信 編集キー/
■74694 / inTopicNo.5)  Re[4]: C#についての質問
□投稿者/ daive (34回)-(2015/01/23(Fri) 10:25:57)
気になったので、
NonSoft さんの、TCP サーバー/クライアントプログラムを
少し改造して、100ms に一回送受信するようにして、一晩走らせおきましたが、
顕著なメモリーリークも起きず、無応答になることもありませんでした。
Windows 8.1 Update (x64) / VS2013-C#
’
参照サイト
TCP/IPサーバでの送受信サンプル(C#/VB.NET)
 http://homepage2.nifty.com/nonnon/SoftSample/CS.NET/SampleTcpIpSvr.html
ソケット(TCP/IP)での送受信サンプル(C#/VB.NET)
 http://homepage2.nifty.com/nonnon/SoftSample/CS.NET/SampleTcpIp.html

引用返信 編集キー/
■74695 / inTopicNo.6)  Re[1]: C#についての質問
□投稿者/ 魔界の仮面弁士 (201回)-(2015/01/23(Fri) 10:39:42)
No74687 (ぽん吉 さん) に返信
> 変換処理なのですが、この処理を何回もしているとformがフリーズしてしまいます。

・その一行を実行するのに、最大でどの程度の時間を要するのか。
・およそ何回目にフリーズするのか。
・あるいは、該当処理を実施した後、それ以外の別の処理でフリーズしているのか?

といった調査が必要でしょうね。


> System.Text.Encoding.GetEncoding(932).GetString(TargetByte2)

ひとつ気になる点があります。上記の変換処理を行った後、その結果を
どのように取り扱っていますか?

たとえば、StringBuilder や StreamWriter などを用いることなく、
 buffer += System.Text.Encoding.GetEncoding(932).GetString(TargetByte2);
のような単純な文字列連結を繰り返すコードだとしたら、データが長くなるにつれ、
各回の処理時間が増大していくことになりそうですが…。
http://dobon.net/vb/dotnet/string/stringbuilder.html
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -