1

我有一个简单的类,bean 创建了分配,在这个类中,我写入一个中央文件,我用互斥锁保护文件,因为少数类实例可以同时进行写操作。
我没有将文件引用作为参数传递给类。
如果我将文件创建为类中的静态成员怎么办,所以它将被创建一次。
这个会比较好吗 ?这就是我现在所拥有的:

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

在您的情况下,这很好,甚至是首选。所描述情况下的文件是共享资源,应该被视为一个资源(这正是static类范围内的内容)。对同一资源拥有多个句柄只会使代码混淆和复杂化。

但是请注意,这在一定程度上限制了代码的灵活性——例如,如果您需要从类的不同实例访问不同的文件。

于 2012-11-02T08:12:51.513 回答
0

由于您使用的是 Qt,因此您可以只使用带有 connection type 的信号和插槽Qt::QueuedConnection。这样,您可以创建单个输出类并使用QObject::connect. 您将能够取消互斥锁,因为 Qt 事件循环会为您处理所有这些。当然,这假设您的工作线程正在运行它们自己的 Qt 事件循环(最新版本的 Qt 库中的默认值)。

于 2013-01-23T19:22:59.510 回答
0

当一个类的所有成员都是静态的时,你就失去了 OOP 的主要思想。

您可以用标题中定义的一些函数替换该类。

作为性能,我认为您不会注意到差异。

于 2012-11-02T07:18:13.797 回答