Я пишу программу на 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;
}
Пожалуйста, кто-нибудь может дать мне совет, как решить эту ошибку? Заранее спасибо.