0

C++に割り込みを行う方法があるかどうか疑問に思っていました。1 つのプログラムで情報をテキスト ファイルに保存し、もう 1 つのプログラムでテキスト ファイルの内容に応じてステートメントを出力する必要があります。できるだけ正確にしたいので、更新プログラムがファイルを更新するときに印刷プログラムを中断する必要があります。

4

2 に答える 2

1

C++ 自体はこの機能を提供しません。実行中または実行中でない可能性のある他のプログラムについては何も知りません。

調べる必要があるのは、IPC (プロセス間通信) です。これは、おそらくオペレーティング システムが提供するものです。

シグナル、共有メモリ、セマフォ、メッセージ キューなど。

ファイル自体を他のプロセスにコンテンツを配信する方法として使用しているように見えるので、おそらくシグナルが適しています。プロセス A からプロセス B にシグナルを送るだけで、プロセス B でシグナル ハンドラが実行されます。

もちろん、これはすべて、ターゲットにしているオペレーティング システムによって異なります。

于 2012-11-11T04:11:45.327 に答える
1

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;
};
于 2012-11-11T04:17:12.300 に答える