Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
1

WaitForSingleObject

14.07.2012, 15:30. Просмотров 2670. Ответов 7
Метки нет (Все метки)

Приветствую.
Вот собственно код который нужно поправить.
C++
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
void changeFile()
{
    DWORD dwWaitStatus;
    HANDLE dwChangeHandles;
    
    dwChangeHandles = FindFirstChangeNotification(
                                                  "C:\\Test",
                                                  false,
                                                  FILE_NOTIFY_CHANGE_LAST_WRITE
                                                 );
                                                 
    if ( dwChangeHandles == INVALID_HANDLE_VALUE || dwChangeHandles == NULL ) {
         cout << "\n ERROR: FindFirstChangeNotification function failed.\n" << endl;
         ExitProcess( GetLastError() ); 
    }                                             
                                                 
    while( true ) {
           dwWaitStatus = WaitForSingleObject( dwChangeHandles, INFINITE );
           switch( dwWaitStatus ) {
                    
                  case WAIT_OBJECT_0:
                                     getFile(); 
                                     break;
                  case WAIT_TIMEOUT:
                                    cout << "\nNo changes in the timeout period.\n" << endl;
                                    break;                                                        
 
                  default:
                          ExitProcess( GetLastError() );
            }
    }                                                  
}
После выполнения данной функции,когда в директории происходят какие либо изменения(точнее запись в файлы), программка начинает выполнять функцию getFile() бесконечное число раз.Как сделать так ,чтобы функция выполнялась только один раз,то есть одно изменение есть один вызов функции.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2012, 15:30
Ответы с готовыми решениями:

Потоки. WaitForSingleObject.
Здравствуйте! Помогите пожалуйста решить проблему. Читать лучше сразу самый низ кода - большой...

WaitForSingleObject и многопоточность
Добрый день! Мучаюсь с такой задачкой. Имеется C++ DLL, которую до меня писал другой программист....

Приложение останавливается на WaitForSingleObject
Виснет приложение через не определенное время после старта, стек вызов показывает что программа...

WaitForSingleObject вешает интерфейс
Вот решил написать функцию для запуска процесса и ожидание завершения. void StartAndWait (char*...

7
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 19:35 2
По идее она всегда будет выполнять этот цикл. Ведь цикл вечный, оператора break используется только при операторе switch, но на вечный цикл он не распространяется. Проверьте ещё, как был запущен поток. Вы не с этого сайта исходник брали ? http://www.sources.ru/msdn/lib... tory.shtml
0
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
14.07.2012, 19:56  [ТС] 3
Я смотрел как устроен принцип на официальном ресурсе http://msdn.microsoft.com/en-u... s.85).aspx

Добавлено через 6 минут
Уже довольно таки долго пытаюсь решить эту проблему.
0
Эксперт С++
8291 / 6046 / 601
Регистрация: 10.12.2010
Сообщений: 28,119
Записей в блоге: 25
14.07.2012, 20:58 4
C++
1
 case WAIT_OBJECT_0: getFile(); return;
Добавлено через 3 минуты
А вообще я такой код использую
C++
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
//-------------------- Поток мониторинга каталогов ---------------------------------
HANDLE hChange= NULL, hT =NULL;
//---------------------------------------------------------------------------
DWORD WINAPI ThreadFunc(LPVOID)
{
 String sDir= sDskFiles;
 hChange= FindFirstChangeNotificationA(sDir.c_str(),false,FILE_NOTIFY_CHANGE_FILE_NAME); 
 WaitForSingleObject(hChange,INFINITE);
 // Действие
 
 for(;;)
  {
    FindNextChangeNotification(hChange);
    WaitForSingleObject(hChange,INFINITE);
    // Действие
  }
 
 return 0; 
}
//----------------------Создания потока мониторинга ----------------------------------------
if(!hT)
 {
   DWORD lpThreadId;
   hT= CreateThread(NULL,0,ThreadFunc,NULL,0,&lpThreadId);
 }
//---------------------------------------------------------------------------------------------
0
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
15.07.2012, 11:54  [ТС] 5
В примере который вы указали,все отлично,но есть одно но.Он выполняет указанную функцию один раз и вываливается(чего и следовало ожидать),надо же устроить так чтобы при найденном уведомление он выполнял один раз функцию getFile(),после чего цикл продолжался и снова продолжался мониторинг файлов в директории.
0
Эксперт С++
8291 / 6046 / 601
Регистрация: 10.12.2010
Сообщений: 28,119
Записей в блоге: 25
15.07.2012, 17:41 6
Код N2 приведенный мною в посте #4, не вываливается
1
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
15.07.2012, 18:15 7
Mindz, мне кажется, что после FindFirstChangeNotification нужно использовать FindNextChangeNotification, а в конце FindCloseChangeNotification

нечто вроде

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    if ( dwChangeHandles == INVALID_HANDLE_VALUE || dwChangeHandles == NULL ) {
         cout << "\n ERROR: FindFirstChangeNotification function failed.\n" << endl;
         ExitProcess( GetLastError() ); 
    }                                             
                                                 
    for ( ; !GetLastError() ; ) {
           dwWaitStatus = WaitForSingleObject( dwChangeHandles, INFINITE );
           switch( dwWaitStatus ) {
                  case WAIT_OBJECT_0:
                                     getFile(); 
                                     FindNextChangeNotification(dwChangeHandles);
                                     break;
                  case WAIT_TIMEOUT:
                                    cout << "\nNo changes in the timeout period.\n" << endl;
                                    break;                                                        
            }
    }
    FindCloseChangeNotification(dwChangeHandles);
1
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
15.07.2012, 20:12  [ТС] 8
Всех благодарю за советы,и предложения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2012, 20:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Мютекс и WaitForSingleObject
Тренируюсь для личного интереса перевожу с С++ на С#. За мой бредняк не ругайте. Вот код на с++...

Не работает WaitForSingleObject
Надобно, чтобы главный поток застопорился и подождал, пока один из дочерних не скажет, что можно...

SetEvent + WaitForSingleObject
Есть ли гарантия, что WaitForSingleObject успеет сработать, если другой поток сделает SetEvent и...

WaitForSingleObject - проблема!
здравствуйте, у меня есть шаблонный список елементов структуры struct proc { int exename;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.