テキストデータの読み書きの高速化
現在2つのアプリケーション間でやり取りするために、間にテキストファイルを用意しています。
テキストファイル内は以下のような記述となっています。
行数は少なく、現時点では198行までしかない状態です。
アプリケーション側のデザインはこのようになっています。
チェックボックスを付けることで先ほどのテキストファイルのc??:の後の数値を0か1に変更しています。
問題点はこのページを表示したときに、テキストファイルの数値を読み取ってチェックボックスにチェックを入れる関数を用意しました。
ですが、速度が遅いため、ページ描画が終わるまでにチェックボックスの処理が終わりません。
具体的には、190個のチェックボックスの制御をするのに5秒程掛かっています。
どう改善すればテキスト読み書きのループ処理を高速化できるようになるのでしょうか。
/* 全チェックボックスを順に取得し、別関数に送る */
private async Task CheckIOClientMod( )
{
int mod , client ;
int cMN = clientModNum;
int cNN = clientNameNum - 1;
for ( mod = 0 ; mod < cMN ; mod++ )
{
for ( client = 0 ; client < cNN ; client++ )
{
if ( clientModCheck[ mod , client ] != null )
{
switch ( mod )
{
case 0: /* God */ await SetCheckIOClientMod( mod , client ); break;
case 1: /* InfAmmo */ await SetCheckIOClientMod( mod , client ); break;
case 2: /* UAV */ await SetCheckIOClientMod( mod , client ); break;
case 3: /* VSAT */ await SetCheckIOClientMod( mod , client ); break;
case 4: /* Laser */ await SetCheckIOClientMod( mod , client ); break;
case 5: /* WalkSpeed */ await SetCheckIOClientMod( mod , client ); break;
case 6: /* InfKS */ await SetCheckIOClientMod( mod , client ); break;
case 7: /* Freeze */ await SetCheckIOClientMod( mod , client ); break;
case 8: /* ToMe */ await SetCheckIOClientMod( mod , client ); break;
case 9: /* ToSky */ await SetCheckIOClientMod( mod , client ); break;
}
}
}
}
}
/* 送られてきた種別、ユーザー番号からIO用テキストファイルより現在の数値状態を読み込む */
private async Task SetCheckIOClientMod( int mod , int client )
{
string ct = "_c";
if ( client < 10 )
ct += "0";
string path = def.Ps4Bo3Path;
string target = "isMod" + def.ioClientModString[ mod ] + ct + client;
string enable = def.Enable;
if ( IOs.CheckStat( path , target ) == enable )
clientModCheck[ mod , client ].Checked = true;
else
clientModCheck[ mod , client ].Checked = false;
await waitTime( 1 );
}
#region 指定したステータス値を読み込む
public string CheckStat( string path , string kw )
{
FileStream fs = new FileStream( path , FileMode.Open , FileAccess.Read , FileShare.ReadWrite ) ; /* 排他制御 */
StreamReader sr = new StreamReader( fs ) ; /* 排他制御 */
string ans = "" ; /* 初期化 */
while ( sr.Peek( ) > -1 ) /* 全行読む */
{
string line = sr.ReadLine( ) ; /* lineに1行分の文字列を代入 */
if ( line.Contains( kw ) ) /* lineの中に指定した文字列があったら */
{
kw += ":" ; /* kwには:が含まれていないので追加する */
int st = kw.Length ; /* stに指定文字数を入れる */
int ls = line.Length ; /* lsに読み取った行の長さを入れる */
int sp = ls - st ; /* 読み取り行 - 指定文字数 = あまりの部分 */
ans = line.Substring( st , sp ) ; /* ansにあまりの部分 - 指定文字数 間の文字を代入 */
}
}
return ans ; /* ansを返す */
}
#endregion