Ошибка CreateThread при долгосрочном запуске - PullRequest
1 голос
/ 05 августа 2011

Я пишу программу на C ++, используя WINAPI, чтобы отслеживать определенный каталог на предмет поступления новых файлов и отправлять их в определенном порядке. Файлы получены из живого видеопотока, поэтому в блоке есть 2 файла - аудиофайл и видеофайл, и блоки следует отправлять последовательно. а. к. а. (1.mp3, 1.avi); (2.mp3, 2.avi) ... Архитектура:

1) обнаружение нового файла добавление в папку, вставка имени файла в очередь ввода

2) организовать файлы в единицы, вставить единицы в очередь единиц

3) отправить единицу за единицей

Но так как я должен использовать каталог файлов мониторинга для файлов добавлен туда , я должен убедиться, что файл завершен, a. к. а. он готов к отправке, поскольку сигнал появляется при создании файла, но он еще не заполнен информацией и не закрыт. Таким образом, я извлекаю имя файла из входной очереди, когда в очереди более 1 файла (он же получил сигнал для следующего созданного файла, это означает, что предыдущий файл готов к отправке) или по таймауту (10 секунд), поэтому в течение 10 секунд любой файл должен быть сделано.

Так что в целом эта программа работает и работает правильно. Но, если я предполагаю, что процедура отправки займет слишком много времени, значит очередь модуля будет расти. И после некоторого количества юнитов, помещенных в очередь юнитов, появляется ошибка.

    time[END] = 0;
    time[START] = clock();
    HANDLE    hIOMutex2= CreateMutex (NULL, FALSE, NULL);
        WaitForSingleObject( hIOMutex2, INFINITE );
        hTimer = CreateThread(NULL, 0, Timer, time, 0, &ThreadId1);
        if(hTimer == NULL)
            printf("Timer Error\n");
    ReleaseMutex(hIOMutex2);
    ReadDirectoryChangesW(hDir, szBuffer, sizeof(szBuffer) / sizeof(TCHAR), FALSE, FILE_NOTIFY_CHANGE_FILE_NAME, &dwBytes, NULL, NULL);
    HANDLE    hIOMutex= CreateMutex (NULL, FALSE, NULL);
        WaitForSingleObject( hIOMutex, INFINITE );
        time[END] = clock();
        TerminateThread(hTimer, 0);
    ReleaseMutex( hIOMutex);

После примерно 800 единиц, помещенных в очередь, моя программа выдает мне сообщение «Ошибка времени», если я прав, это означает, что программа не может выделить поток. Но в этом коде программа прерывает поток таймера ровно после того, как файл был создан в каталоге. Так что я немного запутался с этой ошибкой. Также интересно то, что даже с этой временной ошибкой моя программа продолжает отправлять модули как обычно, так что это не похоже на ошибку ОС или что-то другое, это неправильное объявление / завершение потока, по крайней мере, мне так кажется. Также предоставьте код таймера ниже, если это полезно.

DWORD WINAPI Timer(LPVOID in){
clock_t* time = (clock_t*) in;
while(TRUE){
    if(((clock() - time[START])/CLOCKS_PER_SEC >= 10) && (!time[END]) && (!output.empty())){
        Send();
        if(output.empty()){
            ExitThread(0);
        }
    }
    else if((output.empty()) || (time[END])){
        break;
    }
    else{
        Sleep(10);
    }
}
ExitThread(0);
return 0;
}

Пожалуйста, кто-нибудь может дать мне совет, как решить эту ошибку? Заранее спасибо.

1 Ответ

4 голосов
/ 05 августа 2011

Использование TerminateThread - плохая идея во многих отношениях. В вашем случае это делает вашу программу неудачной, потому что она не освобождает память для стека потоков. Ошибка возникает, когда ваша программа использует всю доступную виртуальную память, и CreateThread () не может зарезервировать достаточно памяти для другого потока. Всегда используйте TerminateThread при выходе из программы.

Тебе придется сделать это умнее. Либо, попросив поток успешно завершиться, сигнализируя о событии, либо просто не потребляя такой дорогой системный ресурс только для обработки файла. Простой таймер и один поток могут сделать это тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...