Мне было интересно, если C ++ имеет какой-либо способ делать прерывания. Я хочу, чтобы одна программа сохраняла информацию в текстовом файле, в то время как другая печатает оператор в зависимости от того, что находится в текстовом файле. Поскольку я хочу, чтобы он был максимально точным, необходимо, чтобы программа печати была прервана при обновлении файла программой обновления.
Сам C ++ не дает такой возможности, он ничего не знает о других программах, которые могут или не могут быть запущены.
То, на что вам нужно обратить внимание — это IPC (межпроцессное взаимодействие), то, что ваша операционная система, вероятно, предоставит.
Такие вещи, как сигналы, общая память, семафоры, очереди сообщений и так далее.
Поскольку вы, похоже, используете сам файл в качестве метода доставки контента другому процессу, сигналы, вероятно, являются подходящим способом. Вы просто подали бы сигнал от процесса A к процессу B, и обработчик сигнала запустился бы в последнем.
Конечно все зависит от который операционная система, на которую вы ориентируетесь.
Если вы используете Windows, вы можете использовать FindFirstChangeNotification.
Вот какой-то старый код у меня есть. Это запускается в своем собственном потоке:
DWORD CDiskWatcher::Run(void *vpParameter)
{
CFileNotifyInterface *pIface = (CFileNotifyInterface *)vpParameter;
HANDLE handles[2];
handles[0] = m_hQuitEvent;
handles[1] = ::FindFirstChangeNotification(m_szPath, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_FILE_NAME);
DWORD dwObject;
if (INVALID_HANDLE_VALUE != handles[1]) {
do {
// Wait for the notification
dwObject = ::WaitForMultipleObjects(2, handles, FALSE, INFINITE);
if (WAIT_OBJECT_0 + 1 == dwObject) {
// Continue waiting...
::FindNextChangeNotification(handles[1]);
pIface->FireFileSystemChange(m_szPath);
}
} while (WAIT_OBJECT_0 != dwObject);
// Close handle
::FindCloseChangeNotification(handles[1]);
}
return 0;
}
Примечание. M_hQuitEvent создается с помощью CreateEvent (), а CFileNotifyInterface предназначен для обратных вызовов:
class CFileNotifyInterface
{
public:
virtual void FireFileSystemChange(const char *szPath) = 0;
};