Форум программистов, компьютерный форум CyberForum.ru

WaitForSingleObject - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Mindz
 Аватар для Mindz
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
14.07.2012, 15:30     WaitForSingleObject #1
Приветствую.
Вот собственно код который нужно поправить.
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() бесконечное число раз.Как сделать так ,чтобы функция выполнялась только один раз,то есть одно изменение есть один вызов функции.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2012, 15:30     WaitForSingleObject
Посмотрите здесь:

WaitForSingleObject вешает интерфейс C++
C++ WinAPI WaitForSingleObject - вопрос.
C++ Потоки. WaitForSingleObject.
WaitForSingleObject - проблема! Visual C++
WaitForSingleObject и многопоточность C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 19:35     WaitForSingleObject #2
По идее она всегда будет выполнять этот цикл. Ведь цикл вечный, оператора break используется только при операторе switch, но на вечный цикл он не распространяется. Проверьте ещё, как был запущен поток. Вы не с этого сайта исходник брали ? http://www.sources.ru/msdn/library/m...irectory.shtml
Mindz
 Аватар для Mindz
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
14.07.2012, 19:56  [ТС]     WaitForSingleObject #3
Я смотрел как устроен принцип на официальном ресурсе http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Добавлено через 6 минут
Уже довольно таки долго пытаюсь решить эту проблему.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,572
Записей в блоге: 17
14.07.2012, 20:58     WaitForSingleObject #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);
 }
//---------------------------------------------------------------------------------------------
Mindz
 Аватар для Mindz
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
15.07.2012, 11:54  [ТС]     WaitForSingleObject #5
В примере который вы указали,все отлично,но есть одно но.Он выполняет указанную функцию один раз и вываливается(чего и следовало ожидать),надо же устроить так чтобы при найденном уведомление он выполнял один раз функцию getFile(),после чего цикл продолжался и снова продолжался мониторинг файлов в директории.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,572
Записей в блоге: 17
15.07.2012, 17:41     WaitForSingleObject #6
Код N2 приведенный мною в посте #4, не вываливается
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.07.2012, 18:15     WaitForSingleObject #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);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2012, 20:12     WaitForSingleObject
Еще ссылки по теме:

Мютекс и WaitForSingleObject C#
Delphi Не работает WaitForSingleObject
C++ Приложение останавливается на WaitForSingleObject

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

Или воспользуйтесь поиском по форуму:
Mindz
 Аватар для Mindz
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
15.07.2012, 20:12  [ТС]     WaitForSingleObject #8
Всех благодарю за советы,и предложения.
Yandex
Объявления
15.07.2012, 20:12     WaitForSingleObject
Ответ Создать тему
Опции темы

Текущее время: 12:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru