2

私はQtを初めて使用し、GettingStartedページで学習していまし。次のステートメントの意味と、なぜそれらが必要なのかを知りたいのですが。

オープン機能の場合:

if (!file.open(QIODevice::ReadOnly)) {

    QMessageBox::critical(this, tr("Error"), tr("Could not open file"));

    return;
}

保存機能でも:

if (!file.open(QIODevice::WriteOnly)) {
            // error message
} 

これらの行がないと、これらの関数を実行できませんでした。ドキュメントのエラー処理について読んでみましたが、これらのステートメントの意味を正確に見つけることができませんでした。

4

1 に答える 1

3

読み取り用と書き込み用にファイルを開くことができます。QIODevice::WriteOnlyまたはフラグを使用して、QIODevice::ReadOnly特定のファイルを開くモードを指定しています。

しかし、なぜそれが重要なのでしょうか?

異なるプログラムのいくつかのインスタンスで1つのファイルを開いていて、ファイルモードを指定するようなことはないとします。これで、すべてのファイルがファイルを読み取っている場合(ファイル内の現在の位置へのポインターがすべて異なるため)、これは問題ではありません。すべてのプログラムがファイルから最新の正しい情報を取得するためです。ただし、1つのプログラムだけがファイルに何かを書き込む場合、データに一貫性がなくなるため、他のプログラムが誤ったデータを読み取る可能性があります。

直感的なアプローチは、このファイルに添付されているすべてのプログラムにメッセージを送信して、プログラムが自分自身を更新できるようにすることです。しかし-ファイルが削除された場合はどうすればよいですか?または、新しいデータに適切な位置を設定する可能性がない場合はどうなりますか?また、すべてのプログラムは通知を受けるためにインターフェイスを備えている必要があり、メッセージパッシングのアイデア全体が非常に遅くなる可能性があります(それが機能しないことを除けば)。

つまり、-コンセンサスが作成されているだけです-複数のプログラムがファイルを開いて読み取ることができます-それらはすべて同じで一貫性のあるデータを持っているからです。ただし、書き込み権限を取得することをオペレーティングシステムに通知しているプログラムが1つしかない場合は、ファイルをどのプログラムでも開いてはならず、読み取り用でも書き込み用でもありません。実装によっては、オペレーティングシステムは、すべてのファイルが閉じられるまで呼び出し元をブロックする場合があります。または、呼び出しを無視してエラー情報を呼び出し元に送信する場合もあります。これは、プログラム(またはユーザー)が自分自身をブロックできるため、多くの場合、より適切な方法です。後でもう一度やり直してください。そうしないと、ユーザーに別の宛先に保存するように要求するか、不気味なエラーメッセージを送信する可能性がありますが、ファイルに書き込むことはできません。

最後の段落では、マルチリーダー(シングルライターテクニック)と呼ばれる手法について説明しているため、インターネットまたは並行性クラスの教科書で調べることをお勧めします。

于 2013-02-11T22:51:16.613 に答える