Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
bool CreateDirectoryMonitoring() { //das Verzeichnis zum Überwachen öffnen HANDLE hDir = CreateFile("C:" ,FILE_LIST_DIRECTORY ,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ,NULL ,OPEN_EXISTING ,FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED ,NULL); if(hDir == INVALID_HANDLE_VALUE ) { return false; } OVERLAPPED overlapped; ZeroMemory(&overlapped, sizeof(overlapped)); overlapped.hEvent = NULL; DWORD byteRerurned = 0; FILE_NOTIFY_INFORMATION Buffer[1024]; if(!ReadDirectoryChangesW(hDir ,&Buffer ,sizeof(Buffer) ,FALSE ,FILE_NOTIFY_CHANGE_FILE_NAME ,&byteRerurned ,&overlapped ,&ChDirCompletionRoutine) ) { return false; } return true; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
void CALLBACK ChDirCompletionRoutine(DWORD dwErrorCode ,DWORD dwNumberOfBytesTransfered ,LPOVERLAPPED lpOverlapped) { WriteToHtml("Datei in C: bearbeitet",3);//dieser Aufruf geht auf jedenfall, da er auch in anderen Teilen des Programms erfolgreich genutzt wird } |
Administrator
Zitat von »MSDN«
[...] This routine is called whenever the operation has been completed or canceled while the thread is in an alertable wait state.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
... hot_swap_watch_completion_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0U, 1U); hot_swap_watch_thread = std::thread(hotSwapWatchThread, plugin_dir, static_cast<HANDLE>(hot_swap_watch_completion_port), GetCurrentThreadId()); ... void hotSwapWatchThread(const Win32::path& plugin_dir, HANDLE completion_port, DWORD notify_thread) { const DWORD buffer_size = 2048; char buffer[buffer_size]; while (true) { Win32::Handle directory = CreateFileW(plugin_dir, FILE_GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, 0); if (CreateIoCompletionPort(directory, completion_port, 0U, 1U) != completion_port) return; while (true) { DWORD bytes_read = ~0U; OVERLAPPED o; o.Pointer = buffer; o.hEvent = 0; if (ReadDirectoryChangesW(directory, buffer, buffer_size, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, &bytes_read, &o, nullptr) == 0) { if (bytes_read == 0) break; return; } ULONG_PTR key; OVERLAPPED* io; if (!GetQueuedCompletionStatus(completion_port, &bytes_read, &key, &io, INFINITE)) return; auto info = static_cast<FILE_NOTIFY_INFORMATION*>(io->Pointer); // do stuff with info } } } |
Administrator
Zitat von »"MSDN"«
FILE_NOTIFY_CHANGE_FILE_NAME
Any file name change in the watched directory or subtree causes a change notification wait operation to return. Changes include renaming, creating, or deleting a file.
Den "alertable wait state" kann man den auch bewirken ohne das Programm anzuhalten durch Funktionen wie SleepEx oder muss ich nach einer anderen Methode suchen damit ich nebenbei noch anderes unternehmen kann?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
DWORD WINAPI CreateDirectoryMonitoringThread(LPVOID Data) { //das Verzeichnis zum Überwachen öffnen HANDLE hDir = CreateFile("C:" ,FILE_LIST_DIRECTORY ,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ,NULL ,OPEN_EXISTING ,FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED ,NULL); if(hDir == INVALID_HANDLE_VALUE ) { WriteToHtml("Das Aktivieren der Verzeichnisüberwachung ist fehlgeschlagen",3); return 1; } OVERLAPPED overlapped; ZeroMemory(&overlapped, sizeof(overlapped)); overlapped.hEvent = NULL; DWORD byteRerurned = 0; FILE_NOTIFY_INFORMATION Buffer[1024]; if(!ReadDirectoryChangesW(hDir ,&Buffer ,sizeof(Buffer) ,FALSE ,FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME ,&byteRerurned ,&overlapped ,&ChDirCompletionRoutine) ) { WriteToHtml("Das Aktivieren der Verzeichnisüberwachung ist fehlgeschlagen",3); return 1; } SleepEx(INFINITE,true); return 0; } |
C-/C++-Quelltext |
|
1 |
hThread = CreateThread(NULL,0,CreateDirectoryMonitoringThread,NULL,0,&dwThreadID); |
Administrator
Werbeanzeige