글
파일변경 알림 ReadDirectoryChangesW() 함수
프로그래밍
2012. 5. 9. 11:20
Excel 파일이 변경되면 자동으로 감시해서 reload하는 기능을 구현하려고 하는데 생각보다 골치아프다.
일단 여러 가지 방법이 있다.
제일 만만한 건 ReadDirectoryChangesW() 함수인데..
관련링크:
http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
일단 여러 가지 방법이 있다.
제일 만만한 건 ReadDirectoryChangesW() 함수인데..
파일 복사가 엄청나게 많이 일어나는 상황이면 노티파이가 사라져 버릴 수 있다고 한다. (아래 링크 참조)
근데 테스트해 보니 오히려 노티파이가 너무 많아서 곤란. 아무래도 파일을 write하는 동안/혹은 flush될 때마다 한 번씩발생하는 것 같다.
노티를 받더라도 변경된 파일의 시간이나 사이즈 등을 검사해서 확인하지 않으면 중복작업을 엄청나게 여러 번 수행하게 될 수도 있다.
또는 이런 방법으로 중복작업을 줄일 수 있다:
이 함수는 결과를 APC로 받을 수 있는데 이를 위해서 SleepEx()같은 걸 호출해 주어야 한다. 이때 APC 호출이 모여서 일어나므로, APC callback function에서는 변경된 파일의 리스트만 저장해 두고(set<string>을 써서 중복파일은 1개만 insert) SleepEx()가 반환된 후에 이 결과에서 릴로드를 처리하면 중복작업을 줄일 수 있다.
근데 테스트해 보니 오히려 노티파이가 너무 많아서 곤란. 아무래도 파일을 write하는 동안/혹은 flush될 때마다 한 번씩발생하는 것 같다.
노티를 받더라도 변경된 파일의 시간이나 사이즈 등을 검사해서 확인하지 않으면 중복작업을 엄청나게 여러 번 수행하게 될 수도 있다.
또는 이런 방법으로 중복작업을 줄일 수 있다:
이 함수는 결과를 APC로 받을 수 있는데 이를 위해서 SleepEx()같은 걸 호출해 주어야 한다. 이때 APC 호출이 모여서 일어나므로, APC callback function에서는 변경된 파일의 리스트만 저장해 두고(set<string>을 써서 중복파일은 1개만 insert) SleepEx()가 반환된 후에 이 결과에서 릴로드를 처리하면 중복작업을 줄일 수 있다.
그래서.. FindFirstChangeNotification() 함수도 테스트 해 봤다. 얘는 또 다른 오묘함이 있다.
- 제일 곤란했던 상황은..
- 여러 개의 폴더를 동시에 감시하고 싶었다.
- WaitForMultipleObjects()를 썼다.
- 근데 signal을 받으면 FindNextChangeNotification(handle)을 한번 더 호출해야 함.
- 혹시라도 signal이 2개가 동시에 깨어나면 WaitForMultipleObjects()의 결과값으로는 1개밖에 알 수가 없음.
- 감시하고 싶은 폴더 개수만큼 WaitForSingleObject()를 쓰는 수 밖에 없음..
- 이건 좀..
강호의 말로는:
WaitForMultipleObjects()는 signal 1개당 1번씩 불린다고 한다.
따라서 signal을 받으면 dwMilliseconds=0 으로 주고 WaitForMultipleObjects()를 여러 번 호출하는게 정석이라고 하네. 이렇게 하면 문제 없겠다.
덤으로 이 루프를 처리할 때는 signal 받은 핸들이 N번째이면 N+1번째 부터 wait하는 게 정석.
관련링크:
http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
'프로그래밍' 카테고리의 다른 글
std::string Trim (0) | 2012.05.12 |
---|---|
파일변경 알림 ReadDirectoryChangesW() 함수 (1) | 2012.05.09 |
HDR 쓸 때 주의할 점 (0) | 2008.11.24 |
minidump (0) | 2008.03.04 |
[GDC] Networked Physics (1) | 2008.02.23 |
프로그래밍(재탕) (3) | 2007.12.19 |
RECENT COMMENT