1

ファイルを読み取り、コンテンツに対していくつかの操作を実行し、タイムスタンプ付きの新しいファイルを保存するクラスを作成しました。しかし、私は、ファイルが存在するかどうかをコードが1分ごとにチェックするような方法で実行する必要があります。はいの場合、ファイルを処理する必要があります。クロスプラットフォームで動作する必要があります。

私はC++の初心者であり、このためにどのようなアプローチに従う必要があるかを知る必要があります。プロセスか何かを作成する必要がありますか?私は完全に空白です。

class inputHandler
{
public:

void readInput();
void performTask();
void saveFile();
};

コードの実装が大きすぎるので、構造を投稿しています。私はこれに時間を費やす準備ができています。だから、私はこれを達成するために私を導くことができるサンプルチュートリアルが必要です。

4

2 に答える 2

1

簡単な部分は、ファイルが存在するかどうかを確認することです。ファイルを開くとstd::ifstream、ファイルが存在する場合にのみ良好な状態になります。

std::ifstream in(filename);
if (in) {
    // the file exists and can be processed here
}

より興味深い部分は、定期的に何かをすることです。基本的な考え方は、何らかの形でタイマーを設定することです。他に何かを行う必要があるかどうかによっては、別のスレッドが必要になる場合があります。プログラムがファイルが存在するまで待機し、その間に何も実行しない場合は、スリープ状態で別のスレッドを生成する必要はありません。それ以外の場合は、スリープ状態のスレッドを生成する必要があります。

別のスレッドを使用する必要があると仮定すると、別のスレッドからの条件に応じてクリーンな方法で終了するなど、待機を中断できるようにする必要があります。したがって、私は時限待機を伴う条件変数を使用します。つまり、次のようなものです。

std::mutex              guard;
std::condition_variable condition;
bool                    done(false);

std::unique_lock<std::mutex> lock(guard);
while (!done) {
    condition.wait_for(lock, std::chrono::minutes(n));
    if (!done) {
        do_whatever_needs_to_be_done_once_every_n_minutes();
    }
}

上記のコードはC++2011機能を使用しています。対応するクラスを使用できない場合は、Boostクラスなどの適切な代替手段を使用できます。

于 2012-10-16T18:08:56.540 に答える
1

これは、C++標準では対処されていません。したがって、サポートされているシステムごとにコードを実装するか、ライブラリを使用する必要があります。

私が理解している限り、最も一般的な解決策は、ファイルのタイムスタンプをチェックして、毎分ループするスレッドを作成することです。当然、コードによっては、スレッドを一切使用せずに、別の方法で実行することもできます。のような通知システムを使用すると、inotifyはるかに優れている可能性があります。alarm()また、 POSIX互換システムで使用することもでき、1分が経過するたびにアラームが発生します。

とにかく、スレッドソリューションを使用する場合は、POSIX互換システムでチェックアウトしpthread_create()てくださいstat()。Windowsでは、チェックアウトしCreateThread()GetFileTime()。1分の遅延があるか、sleep(60000)またはSleep(60000)それぞれがトリックを実行する必要があります。

明確にするために、「プロセスを作成する」とは、システムのプログラミング用語であり、大まかに「新しいプログラムを起動する」(または「スレッド」)ことを意味します。その意味で、上記に従うと、新しいスレッドが作成されます。

于 2012-10-16T17:54:28.780 に答える