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

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

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

WaitForSingleObject - C++

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

Потоки. 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. Как она работает? Ждет завершения патока (тот, что первий параметр), зачем тогда задержка...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Большой_Стен
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
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
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,387
Записей в блоге: 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
7 / 7 / 1
Регистрация: 31.01.2010
Сообщений: 51
15.07.2012, 11:54  [ТС]     WaitForSingleObject #5
В примере который вы указали,все отлично,но есть одно но.Он выполняет указанную функцию один раз и вываливается(чего и следовало ожидать),надо же устроить так чтобы при найденном уведомление он выполнял один раз функцию getFile(),после чего цикл продолжался и снова продолжался мониторинг файлов в директории.
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,387
Записей в блоге: 17
15.07.2012, 17:41     WaitForSingleObject #6
Код N2 приведенный мною в посте #4, не вываливается
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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 - Delphi
Надобно, чтобы главный поток застопорился и подождал, пока один из дочерних не скажет, что можно идти: Главный: ...

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

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

Qt аналог функции WaitForSingleObject из WinAPI - C++ Qt
Здравствуйте! Есть функция WaitForSingleObject(p_class-&gt;c_handle, 3000). Т.е. она как-бы в течение 3 секунд проверяет, свободен или занят...

Разница между TThread::WaitFor и WaitForSingleObject - C++ Builder
Доброго времени суток! Имеется код: Главный модуль //Main.cpp HANDLE hMyThread = NULL; TThread* MyThread = NULL;


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

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

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