Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
46 / 43 / 1
Регистрация: 02.07.2007
Сообщений: 2,446
1

_tWinMain(): организовать запуск и работу таймера на фоне работы ReadDirectoryChangeW()

07.08.2011, 21:27. Показов 1663. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот так таймер работает:
Код
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int cmdShow)
{
    SetTimer(NULL, NULL, MY_TIME_PERIOD, (TIMERPROC)MyTimerProc);
    MessageCycle():

    return 0;
}

VOID CALLBACK MyTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwtime)
{
    i++;
}

void MessageCycle()
{
    MSG msg;
    BOOL bRet; 
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    { 
        if (bRet == -1)
        {
            // handle the error anpossibly exit
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
    } 
}
А вот так нет:
Код
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int cmdShow)
{
    SetTimer(NULL, NULL, MY_TIME_PERIOD, (TIMERPROC)MyTimerProc);
  
    Cycle();

    return 0;
}

void Cycle()
{
    HANDLE hDir = CreateFile(_T(pathDir),                        // pointer to the file name
                            FILE_LIST_DIRECTORY,                // access (read/write) mode
                            FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,  // share mode
                            NULL,                               // security descriptor
                            OPEN_EXISTING,                      // how to create
                            FILE_FLAG_BACKUP_SEMANTICS,         // file attributes    (FILE_FLAG_OVERLAPPED)
                            NULL);                              // file with attributes to copy
                            
  
    const DWORD dwNotificationFlags = FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME;
    FILE_NOTIFY_INFORMATION Buffer[1024];
    DWORD BytesReturned;
    VOID *pBuf = (BYTE*)&Buffer;    

    while (ReadDirectoryChangesW(hDir,                     // handle to directory
                                 &Buffer,                  // read results buffer
                                 sizeof(Buffer),           // length of buffer
                                 TRUE,                     // monitoring option
                                 dwNotificationFlags,
                                 &BytesReturned,           // bytes returned
                                 NULL,                     // overlapped buffer
                                 NULL))                       // completion routine
                                 
    {
        FILE_NOTIFY_INFORMATION* pInfo = (FILE_NOTIFY_INFORMATION*) pBuf;
        SelectAction(pInfo);

    }
    
    CloseHandle(hDir);

}

VOID CALLBACK MyTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwtime)
{
    i++;
}
Нет захода MyTimerProc. Any revolutionary ideas?

VS 2008
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2011, 21:27
Ответы с готовыми решениями:

Как организовать запись звука в фоне?
Доброго дня! Есть задача: организовать постоянную запись звука с микрофона в фоновом режиме с...

Запуск 1с в фоне
Подскажите как можно запустить 1с 8.2 в фоне? Т.е.стоит 1с на кассе, каждые там n часов запускается...

Запуск webbrowser в фоне
Здравствуйте! У меня такой вопрос: можно ли запустить webbrowser(стандартная библиотека import...

Запуск другого приложения в фоне
Здравствуйте! Каким образом можно запустить второе приложение без потери фокуса и сворачивания...

3
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 21:33 2
В цикл разбора сообщений должно приходить WM_TIMER, если вы не ответите нулем на это сообщение, то оно обработано не будет
в первом случае сообщение обрабатывает DispatchMessage, который вызывает callback
0
46 / 43 / 1
Регистрация: 02.07.2007
Сообщений: 2,446
07.08.2011, 21:41  [ТС] 3
>>В цикл разбора сообщений должно приходить WM_TIMER, если вы не ответите нулем на это сообщение

Как мне ответить на него нулём?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 21:48 4
это немного не о том
вы даже сообщений не обрабатываете - GetMessage нигде не вызывается
технология работы
1) создаете таймер - SetTimer
2) проходит интервал времени - система кладет сообщение WM_TIMER в очередь сообщений вашего окна/приложения
3) вы делаете GetMessage - достаете сообщение
4) дальше либо сами его обрабатываете, либо делаете Translate/Dispatch (система сама обрабатывает, вызывает)

во-втором случае никакой обработки нет, ничего само вызываться не будет
тут нужно сделать отдельный поток для обработки либо сообщений, либо ReadDirectoryChangesW
0
07.08.2011, 21:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2011, 21:48
Помогаю со студенческими работами здесь

Запуск случайного видео на фоне
Добрый день. Суть в том, чтобы при обновлении страницы, на фоне отображалось случайное видео из...

Запуск Bash скрипта в фоне
Всем привет. Написал небольшой Bash скрипт, который должен собирать статистику о работе пк. В...

Запуск скрипта и его работа в фоне
Здравствуйте уважаемые форумчане. Нужен совет. Есть у меня...

Помогите организовать прерывание таймера на Cortex-M3
Уважаемые специалисты, я имею некоторый опыт работы с AVR и теперь пытаюсь освоить ARM. У меня...

Запуск программы в фоне (без консольного окна)
Нужно запустить программу написанную на c++ чтоб выполнялась в фоне(без консоли).Как это можно...

Запуск таймера
вроде бы написал все правильно, но на форме таймер не запускаетсяprocedure...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru