0

メインウィンドウがあるとします。メイン ウィンドウには、発生したことを記録するためのログ ウィンドウや、ユーザーのデータを操作するための多数の操作ウィンドウなど、いくつかの子ウィンドウがあります。操作ウィンドウでの各操作の後、ログウィンドウに記録したいと思います。それを実装するにはいくつかの方法があります。

  1. オペレーティング ウィンドウにログ ウィンドウを指すポインタを置きます。これを行うには、操作ウィンドウはポインターにバインドされているため、あまり再利用できないと思います。いつの日かログが不要になったら、削除する必要があります。また、この方法では少し多くのメモリが必要になる場合があります。また、操作ウィンドウがメインウィンドウの子の子、子の子…の場合は、内部のポインタを1つずつ転送する必要があります。

  2. メインウィンドウをシングルトンにし、公開ログ機能を追加します。ログが必要な場合は、MainWindow::Inheritance()->Log(theInformation) のように呼び出します。しかし、いつか 2 つのメイン ウィンドウがあるとしたらどうなるでしょうか。

問題に対する良い提案。どうもありがとう!

4

3 に答える 3

1

通常、ロガーはシングルトンとして記述します。

ロギング機能を削除したい場合は、フラグを設定する (ランタイム ロギング コントロール用) か、ダミー クラスに置き換える (コンパイル時ロギング コントロール用) のいずれかが簡単です。

したがって、非常に基本的には、次のようになる可能性があります。

Log::Get().Error("Name truncated by %u bytes", nBytes );

はい、可変長の printf スタイルのログ関数を使用するのが好きですが、単一の文字列のみを使用するか、C++ ストリーム演算子を使用することを好む場合があります。

複数のログが必要な場合は、それを再利用可能なクラスにして、それらのインスタンスを別のシングルトン ( 「アプリケーション」クラスなど)に配置します。その場合、私は持っているかもしれません:

Log::EventsLog().Info("Something exciting happened" );
Log::SystemLog().Info("Shutting down" );

一般に、ログ メッセージが同時に呼び出される可能性がある (予定されている) 場合は、ログ メッセージに対して何らかの形式のミューテックス コントロールが必要です。シングルスレッド キューを介してログ ウィンドウにメッセージを配信する場合 (Windows メッセージ パッシングのように)、これは必要ないかもしれません。

于 2013-01-29T13:55:20.910 に答える
1

適切な解決策は、ロギング データを完全に別のクラスに入れることだと思います。その目的は、ログ情報の保存と取得 (および切り捨てと保存など)だけです。データをログに記録する必要がある他のすべてのウィンドウ、クラスなどは、単一のログ クラス ポインターにアクセスする必要があります。

logSystem->log("my friend is blue");

ここで、logSystem がグローバルであるか、初期化中に各クラスに渡されるオブジェクトであるかは、あなた次第です。この別の質問であなたを助ける「グローバルは悪」と「グローバルは役立つ」人々の陣営がたくさんあります。

次に、ログ ウィンドウで、ログに記録されたデータを取得して表示するだけです。

 // Qt, C++-11 pseudo-api
foreach(String log, logMessages) {
    myListBox->append(log);
}

このアプローチのもう 1 つの利点は、ログ ウィンドウを開いたり閉じたり (作成および破棄) しても、データ自体が失われないことです。はい、ログ ウィンドウやその他のトリックを非表示にすることもできますが、完全に破棄して再作成できると、はるかにクリーンに見えます。言うまでもなく、ログ ウィンドウからログ データを分離することにより、後で 2 つの異なるログ データ セットを表示する 2 つのウィンドウを作成できます。[上記のロギング データにそのグローバルを使用しなかったと仮定します。]

于 2013-01-29T13:52:21.777 に答える
0

ロギング機能はスタンドアロンの「シングルトン」クラスとして実装する必要があると思っていたでしょう...

于 2013-01-29T13:44:15.300 に答える