Освобождение ресурсов в потоке
От: Аноним  
Дата: 26.03.03 16:33
Оценка:
Есть такой код (отдельный поток):
DWORD WINAPI TrackFolder(LPVOID lpParam)
{
    DWORD  dwWaitStatus;
    HANDLE hWaitHandle;
    LPTrackParams params = (LPTrackParams)lpParam;

    hWaitHandle = FindFirstChangeNotification(
                    params->szFolder,
                    params->bSub,
                    FILE_NOTIFY_CHANGE_FILE_NAME);
    
    if (hWaitHandle == INVALID_HANDLE_VALUE)
        ExitThread(GetLastError());

    while (TRUE)
    {
        dwWaitStatus = WaitForSingleObject(hWaitHandle,INFINITE);
        if (!*(params->bStop))
        {
            FindCloseChangeNotification(hWaitHandle);
            ExitThread(GetLastError());
        }

        SendMessage(params->hHost,UWM_NEWFILES,(WPARAM)params->szFolder,0);

        if ( FindNextChangeNotification(hWaitHandle) == FALSE )
        {
            FindCloseChangeNotification(hWaitHandle);
            ExitThread(GetLastError());
        }
    }
}


Все работает, но вот есть такая неправильность:
при установке params->bStop в FALSE в основном потоке работчий поток завершается и освобождает ресурсы только после того, как произойдут какие-нидудь изменения в params->szFolder, а этого может и не случиться до завершение программы Как мне более правильно организовать мониторинг директории в отдельном потоке?
Re: Освобождение ресурсов в потоке
От: SergH Россия  
Дата: 26.03.03 16:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Все работает, но вот есть такая неправильность:

А>при установке params->bStop в FALSE в основном потоке работчий поток завершается и освобождает ресурсы только после того, как произойдут какие-нидудь изменения в params->szFolder, а этого может и не случиться до завершение программы Как мне более правильно организовать мониторинг директории в отдельном потоке?

Использовать WaitForMultipleObjects и дополнительное событие "конец работы".
Делай что должно, и будь что будет
Re[2]: Освобождение ресурсов в потоке
От: Аноним  
Дата: 26.03.03 16:42
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, Аноним, Вы писали:


А>>Все работает, но вот есть такая неправильность:

А>>при установке params->bStop в FALSE в основном потоке работчий поток завершается и освобождает ресурсы только после того, как произойдут какие-нидудь изменения в params->szFolder, а этого может и не случиться до завершение программы Как мне более правильно организовать мониторинг директории в отдельном потоке?

SH>Использовать WaitForMultipleObjects и дополнительное событие "конец работы".

Да, но тогда это событие придется делать глобальным, что не очень хочется
Re[3]: Освобождение ресурсов в потоке
От: SergH Россия  
Дата: 26.03.03 16:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Да, но тогда это событие придется делать глобальным, что не очень хочется


А почему нельзя передавать так же, в параметре?
Делай что должно, и будь что будет
Re[4]: Освобождение ресурсов в потоке
От: SergH Россия  
Дата: 26.03.03 16:47
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, Аноним, Вы писали:


А>>Да, но тогда это событие придется делать глобальным, что не очень хочется


SH>А почему нельзя передавать так же, в параметре?


В смысле вместо bStop сделать hStop и ждать на нём.
Делай что должно, и будь что будет
Re: Освобождение ресурсов в потоке
От: gem Россия  
Дата: 27.03.03 06:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такой код (отдельный поток):

А>
А>DWORD WINAPI TrackFolder(LPVOID lpParam)
А>{
А>    DWORD  dwWaitStatus;
А>    HANDLE hWaitHandle;
А>    LPTrackParams params = (LPTrackParams)lpParam;

А>    hWaitHandle = FindFirstChangeNotification(
А>                    params->szFolder,
А>                    params->bSub,
А>                    FILE_NOTIFY_CHANGE_FILE_NAME);
А>    
А>    if (hWaitHandle == INVALID_HANDLE_VALUE)
А>        ExitThread(GetLastError());

А>    while (TRUE)
А>    {
А>        dwWaitStatus = WaitForSingleObject(hWaitHandle,INFINITE);
А>        if (!*(params->bStop))
А>        {
А>            FindCloseChangeNotification(hWaitHandle);
А>            ExitThread(GetLastError());
А>        }

А>        SendMessage(params->hHost,UWM_NEWFILES,(WPARAM)params->szFolder,0);

А>        if ( FindNextChangeNotification(hWaitHandle) == FALSE )
А>        {
А>            FindCloseChangeNotification(hWaitHandle);
А>            ExitThread(GetLastError());
А>        }
А>    }
А>}
А>


А>Все работает, но вот есть такая неправильность:

А>при установке params->bStop в FALSE в основном потоке работчий поток завершается и освобождает ресурсы только после того, как произойдут какие-нидудь изменения в params->szFolder, а этого может и не случиться до завершение программы Как мне более правильно организовать мониторинг директории в отдельном потоке?здесь

Для корректного завершения потока мониторинга дериктории в рабочем потоке создайте событие и воспользуйтесь ф-ей WaitForMultipleObjects(), в которую передайте хэнделы события и отслеживаемой директории....
при необходимости в рабочем потоке сбрасывайте событие и соответствующим образом обрабатывайте результат WaitForMultipleObjects...
удачи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.