Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Mindz
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
#1

WaitForSingleObject - C++

14.07.2012, 15:30. Просмотров 1803. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2012, 15:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос WaitForSingleObject (C++):

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

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

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

WaitForSingleObject вешает интерфейс - C++
Вот решил написать функцию для запуска процесса и ожидание завершения. void StartAndWait (char* Program, char* WorkDirectory) { ...

SetEvent + WaitForSingleObject - Delphi WinAPI
Есть ли гарантия, что WaitForSingleObject успеет сработать, если другой поток сделает SetEvent и CloseHandle подряд? Добавлено через...

WaitForSingleObject - вопрос. - C++ WinAPI
Привет. WinApi функция WaitForSingleObject. Как она работает? Ждет завершения патока (тот, что первий параметр), зачем тогда задержка...

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

Добавлено через 6 минут
Уже довольно таки долго пытаюсь решить эту проблему.
0
Avazart
Эксперт С++
7236 / 5432 / 304
Регистрация: 10.12.2010
Сообщений: 24,143
Записей в блоге: 17
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
Mindz
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
15.07.2012, 11:54  [ТС] #5
В примере который вы указали,все отлично,но есть одно но.Он выполняет указанную функцию один раз и вываливается(чего и следовало ожидать),надо же устроить так чтобы при найденном уведомление он выполнял один раз функцию getFile(),после чего цикл продолжался и снова продолжался мониторинг файлов в директории.
0
Avazart
Эксперт С++
7236 / 5432 / 304
Регистрация: 10.12.2010
Сообщений: 24,143
Записей в блоге: 17
15.07.2012, 17:41 #6
Код N2 приведенный мною в посте #4, не вываливается
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 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
Mindz
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
15.07.2012, 20:12  [ТС] #8
Всех благодарю за советы,и предложения.
0
15.07.2012, 20:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2012, 20:12
Привет! Вот еще темы с ответами:

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

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

Мютекс и WaitForSingleObject - C#
Тренируюсь для личного интереса перевожу с С++ на С#. За мой бредняк не ругайте. Вот код на с++ UINT EventThread(LPVOID pParam) { ...

Вопрос по работе WaitForSingleObject - C++ WinAPI
Постановка задачи следующая. Есть основной процесс, который заведует отображением GUI и есть поток, который делает вычисления. Поток в...


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

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

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