1

Bean が割り当てを作成した単純なクラスがあります。このクラスでは、1 つの中央ファイルに書き込み、ミューテックスでファイルを保護します。これは、いくつかのクラス インスタンスが同時に書き込み操作を実行できるためです。
ファイル参照を引数としてクラスに渡しません。
クラスの静的メンバーとしてファイルを作成すると、ファイルは一度作成されます。
それは良いですか?これは私が今持っているものです:

CollectorWorker::CollectorWorker()
{
   m_pFileOutput = new QFile("my_result.txt");
   if (!m_pFileOutput->open(QIODevice::WriteOnly
                          | QIODevice::Text | QIODevice::Append))
   {
     LOG_MSG("my_result.txt can't be open")
   } 
}

//header
QFile* m_pFileOutput;

またはこれを静的に

QFile* CollectorWorker::m_pFileOutput = new QFile("my_result.txt");
CollectorWorker::CollectorWorker()
{
  if (!m_pFileOutput->open(QIODevice::WriteOnly
                         | QIODevice::Text | QIODevice::Append))
  {
    LOG_MSG("my_result.txt can't be open")
  } 
}

//header
static QFile* m_pFileOutput;
4

4 に答える 4

1

必要なすべての CollectWorker オブジェクトによってアクセスされるクラス (またはグローバル) ファイル ポインターが必要な場合は、

  1. 最初のCollectWorker オブジェクトの構築の外側でも初期化します。クラス静的 Init() メンバー (および対応する Close()) がこれを行います。
  2. シングルスレッドの場合は、コンストラクターでファイル ポインターをチェックして、既に作成されて開かれているかどうかを確認し、そうでない場合にのみ作成することで、コンストラクターで要求作成できます。
  3. マルチスレッドの場合、コンストラクタ入力でラッチできるクラスレベルのミューテックスが必要です。ポインタをチェックし、ポインタが NULL の場合にのみ作成し、ミューテックスのラッチを解除します。

複数の CollectWorker インスタンスで同じファイルを参照するために同じファイルオブジェクトを使用しているのは奇妙だと思います。それぞれが異なる状態のファイル ポインターを期待している可能性があります。これは単なるトラブルの原因になると思います。これが読み取り専用の場合は、各 CollectWorker が独自の QFile ポインター (非静的) を使用して同じファイルを開くだけで、すべてが独自のポインターを取得し、さらに重要なことに、ファイル内の読み取りオフセットを取得できるようにする方がはるかに優れています。実行時に。

于 2012-11-02T08:13:43.403 に答える
0

クラスのすべてのメンバーが静的である場合、メインのOOPのアイデアを失っています。

クラスをヘッダーで定義されたいくつかの関数に置き換えることができます。

パフォーマンスとしては、違いに気付かないと思います。

于 2012-11-02T07:18:13.797 に答える
0

Qt を使用しているので、接続タイプでシグナルとスロットを使用できますQt::QueuedConnection。こうすることで、単一の出力クラスを作成し、 を使用してさまざまなワーカーをそれに接続できますQObject::connect。Qt イベント ループがすべてを処理するため、ミューテックス ロックをなくすことができます。もちろん、これはワーカー スレッドが独自の Qt イベント ループを実行していることを前提としています (最近のバージョンの Qt ライブラリのデフォルト)。

于 2013-01-23T19:22:59.510 に答える
0

それは問題なく、あなたの場合にも好まれます。説明されている状況のファイルは共有リソースであり、1 つとして扱われるべきです (それはまさにstaticクラス スコープに関するものです)。同じリソースへの複数のハンドルを持つことは、コードを難読化し、複雑にするだけです。

ただし、これにより、コードの柔軟性が多少制限されることに注意してください。たとえば、クラスのさまざまなインスタンスからさまざまなファイルにアクセスする必要がある場合などです。

于 2012-11-02T08:12:51.513 に答える