1
void LogWriter::WriteLog(LPCTSTR log, const char ending, LPTSTR args, ...)
{
    TCHAR str[128] = {0};
    int len = (sizeof(log)/sizeof(TCHAR));
    len += sizeof(ending)/sizeof(char); //might switch ending to TCHAR..might have to

    _stprintf_s(str, len+4, "%s()%c", log, ending);
    myOutput.push(str);
    //used to output to console for testing
    //if (args != NULL)
    //{
    //    va_list argptr;
    //    va_start(argptr, args);
    //    vfprintf(stdout, args, argptr);
    //    va_end(argptr);
    //}
}

これはログをコンソールに出力するためのクールな方法でした..しかし、今はログを置く場所を選択できるようにしたいと考えています。wcout をファイルまたはコンソールにリダイレクトすることにしました。コンソールに出力していたとき、これを行うのは非常に簡単でした。

void LogWriter::WriteLog(const char* log, const char ending, char* args, ...)
{
    std::wcout << log << "(";
    if (args != NULL)
    {
        va_list argptr;
        va_start(argptr, args);
        vfprintf(stdout, args, argptr);
        va_end(argptr);
    }
    std::wcout << ")" << ending << std::endl;
}

そして人生は良かった...シングルスレッドプログラムで、すべてのログがコンソールに送られていました。そこで、キューを使用して行をログに一時的に保存することにしました。別のスレッドで、キューを空にして 500 ミリ秒スリープします。これはうまく機能します(速度/パフォーマンスについてはまだこれについて多くのテストを行っていません)が、sprintf関数を使用すると、出力が意味不明になります。sprintf をまとめて削除し、ログをキューにプッシュすると、文字列が正しく出力されます。私はsprintfで間違っていることに気づきましたが、変数引数もそこに入れる必要があります/欲しいです.....うーん、何かの変更を意味するかもしれません。これが影響する可能性のあるマクロがいくつかあります..

#define WRITE_START LogWriter::WriteLog(__FUNCTION__, '+')
#define WRITE_STARTF(_smsg, ...) LogWriter::WriteLog(__FUNCTION__, '+', _smsg, __VA_ARGS__) 

//example of usage
void test1(LPCTSTR lpclDevClass, LPCTSTR lpclDevName)
{
    WRITE_STARTF(_T("*%s* %s"), lpclDevClass, lpclDevName);
}
void test2()
{
    WRITE_START;
}

これをどのように行うべきかについてのアイデアはありますか?ありがとうございました

4

0 に答える 0