環境 WindowsXP + VC6++
自作アプリが動作中に作成するログをいつまでも取っておくと
DISKFULLになるため一定期間(90日)以上前のファイルを削除すべく
以下のような関数を作りスレッドとして起動しました
(一部書き直してます)
ところがこの処理動かすとアプリケーションが
ほぼ3時間でハングアップします
デバッガのスタック見ると nTime.Format("%Y/%m/%d %H:%M:%S");
などのCString代入辺りでアロケーションエラーを起こしているようです
(タスクマネージャとかでは殆ど変動ありません)
なんでエラーになるんだろう状態なんですが何か問題あるのでしょうか?
自分的には問題ないと思ってるんですが思い込みの可能性もあるので
何かありましたら御指摘願います
int EraseFile(const char *folderfile, 自作Dialogクラス* pClass)
{
chardrive[_MAX_DRIVE];
chardir[_MAX_DIR];
charfname[_MAX_PATH];
charext[_MAX_EXT];
_splitpath(folderfile, drive, dir, fname, ext);
int c = 0;
CFileFind finder;
BOOL bWorking = finder.FindFile(folderfile);
while((bWorking) && (pClass->th_end_flg == 0)) {
bWorking = finder.FindNextFile();
sprintf(fname, "%s\\%s\\%s\\*.*", drive, dir,finder.GetFileName());
if(finder.IsDots()){// カレント・親フォルダなら無視
continue;
}
if(finder.IsDirectory()){// フォルダだったらフォルダ以下削除チェック
if (EraseFile(fname, pClass) != 0) {
c ++;
continue;
}
sprintf(fname, "%s", finder.GetFilePath());
CTimenTime = CTime::GetCurrentTime();
CTimefTime;
finder.GetLastWriteTime(fTime) ;
CStrings, s1;
s = nTime.Format("%Y/%m/%d %H:%M:%S");
s1 = fTime.Format("%Y/%m/%d %H:%M:%S");
nTime -= CTimeSpan(90, 0, 0, 0);
s = nTime.Format("%Y/%m/%d %H:%M:%S");
if (nTime <= fTime) {
return(1);
}
sprintf(fname, "%s\\%s\\%s\\", drive, dir, finder.GetFileName());
_rmdir(fname);
return(c);
}
sprintf(fname, "%s", finder.GetFilePath());
CTimenTime = CTime::GetCurrentTime();
CTimefTime;
finder.GetLastWriteTime(fTime) ;
CStrings, s1;
s = nTime.Format("%Y/%m/%d %H:%M:%S");
s1 = fTime.Format("%Y/%m/%d %H:%M:%S");
nTime -= CTimeSpan(90, 0, 0, 0);
s = nTime.Format("%Y/%m/%d %H:%M:%S");
if (nTime <= fTime) {
c ++;
continue;
}
CFile::Remove(fname);
}
return(c);
}
//----------------------------------
//スレッド本体
//----------------------------------
UINT 自作Dialogクラス::LogFileAutoEraseThread(PVOID pParam)
{
自作Dialogクラス* pClass=(自作Dialogクラス*)pParam;
while(pClass->th_end_flg == 0){
chardrive[_MAX_DRIVE];
chardir[_MAX_DIR];
charfname[_MAX_PATH];
charext[_MAX_EXT];
Sleep(10);
_splitpath(アプリケーション実行モジュールフルパス, drive, dir, fname, ext);
sprintf(fname, "%s\\%s\\%s\\*.*", drive, USER_NAME_FOLDER, RESULT_FILE_OUTPUT_PATH);
EraseFile(fname, pClass);
Sleep(10);
sprintf(fname, "%s\\%s\\%s\\*.*", drive, USER_NAME_FOLDER, RESULT_FILE_OUTPUT_CSV);
EraseFile(fname, pClass);
Sleep(10);
sprintf(fname, "%s\\%s\\Log\\*.*", drive, USER_NAME_FOLDER);
EraseFile(fname, pClass);
}
return(0);
}
No.1
- 回答日時:
ざっとしか見てませんが
とくにおかしいところはないですね
ためしに時刻を文字列に変換している
ところをすべて消してみては?
恐らくデバッグ用にしてるだけで
ファイルに出力しているわけでは
なさそうですし
以下、気になったところ
・charの配列を初期化していないのはいやですね
char dir[_MAX_DIR] = {0};
という感じで初期化するべきです。
・日付の比較を2箇所でやってますが
一つの関数にするべきです。
もし90日でなく120日とかにでもなると
直すところが2箇所
いやですね~
・fnameを使いまわしているのが気になります
フルパス用に一つ変数を用意するべきでは?
いじょ
ありがとうございます
>とくにおかしいところはないですね
ですよね
>ためしに時刻を文字列に変換している
>ところをすべて消してみては?
それも考えたんですが根本の解決にはならないと考えたもので
今回はあえて原因調べる意図で質問させていただきました
(デバッグ用に変換してるのはご想像道理です)
No.2ベストアンサー
- 回答日時:
CStringが臭い気がするのだが。
http://blog.goo.ne.jp/xmldtp/e/b950d7b57e190cd44 …
http://blog.goo.ne.jp/xmldtp/e/ef0dee354a36ee1a6 …
http://nonki.yoka-yoka.jp/c8302.html
この回答への補足
情報ありがとうございます
URL見ましたがどうも同じ現象のようです
現場でテスト中のため時間かけて調査するわけに行かないのですが_heap_alloc_dbgでエラーになってるのはまったく同じです
また実際テスト環境下での手元PCではシュミレーションで6時間以上
動作させましたが現象は発生していません
実機テストできるのは月曜以降になるのですが
Emptyを使うかCStringの使用をやめるかどちらかの対処を行ったもので
テストして見ようかと思います(3時間かかるのが涙物です)
結果は改めて書き込ませていただきます
本日変更かけたソースにて7時間ほど連続運転したところ状況が改善されてました
こんな意味不明なことがありうるとは・・・・困ったもんだ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) このコードに追記事項の仕方を教えて下さい。 以下のコード内容に出てくる。セルH3が空白の場合、エラー 4 2023/08/03 00:22
- Visual Basic(VBA) Excel VBA でデータ転記について 1 2023/03/07 19:11
- Excel(エクセル) エクセルVBA、間違っているコード内容を正して頂けませんか? エクセルワークシートに納品書を作ったの 2 2023/08/02 21:13
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- Excel(エクセル) 【VBA】複数ブックから特定のシートを抽出して一つのブックに集約するマクロについて 3 2022/09/04 15:05
- Excel(エクセル) エクセル2019でPDFファイル名に枝番号をつけたい。 アクティブワークシートを印刷した後の処理とし 4 2023/06/06 21:00
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報