1

我创建了一个类,它读取文件并对内容进行一些操作并保存一个带有时间戳的新文件。但是,我要求以这样的方式执行,代码应该每隔一分钟检查文件是否存在。如果是,它应该处理该文件。它需要在跨平台上工作。

我是 C++ 的新手,需要知道为此我需要遵循什么方法。我是否需要创建流程或其他东西。我完全空白。

class inputHandler
{
public:

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

由于代码实现太大,我只是发布结构。我准备花时间在这上面。所以,我需要一个示例教程来指导我实现这一目标。

4

2 回答 2

1

C++ 标准没有解决这个问题。因此,您必须为每个受支持的系统实现代码,或使用库。

据我了解,最通用的解决方案是创建一个每分钟循环一次的线程,检查文件时间戳。当然,根据你的代码,你可以用另一种方式来做,避免任何线程。使用通知系统inotify可能会好得多。此外,您可以alarm()在兼容 POSIX 的系统上使用,只要一分钟过去就会发出警报。

无论如何,如果您使用线程解决方案,在 POSIX 兼容的系统中,请查看pthread_create()stat(). 在 Windows 中,签出CreateThread()GetFileTime(). 有一个一分钟的延迟,sleep(60000)或者Sleep(60000)分别应该做的伎俩。

澄清一下,“创建一个进程”是系统的编程术语,大致意思是“启动一个新程序”(或“线程”,有时)。从这个意义上说,如果您遵循上述内容,您将创建一个新线程。

于 2012-10-16T17:54:28.780 回答
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 回答