我正在使用WINAPI编写一个用C ++编写的程序来监视某些目录是否有新文件到达,并按特定顺序发送它们。这些文件来自实时视频流,因此单元中有2个文件 - 音频文件和视频文件,单元应按顺序发送。一个。 ķ。一个。 (1.mp3,1.avi); (2.mp3,2.avi)......架构是:
1)检测新文件添加到文件夹,将文件名插入输入队列
2)将文件组织成单位,将单位插入单位队列
3)按单位发送单位
但是由于我必须在监控文件目录中使用添加文件,我需要确保文件完整,a。 ķ。一个。它已准备好发送,因为信号在创建文件时出现,但尚未填充信息并关闭。所以当队列有多个文件(也就是创建下一个文件的信号,这意味着前一个文件已准备好发送)或超时(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个单元之后,我的程序给了我“Time Error”消息,如果我是对的那意味着程序无法分配线程。但是在这个代码程序中,在目录中创建文件之后完全终止计时器线程。所以我对这个bug感到困惑。同样有趣的是,即使有这个时间错误,我的程序继续像往常一样发送单位,所以看起来不像操作系统错误或不同的东西,它是错误的线程声明/终止,至少对我来说似乎是这样。 如果有帮助,还提供下面的定时器代码。
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;
}
请有人在这里给我一些建议如何解决这个错误?提前谢谢。
答案 0 :(得分:4)
在许多方面使用TerminateThread是一个坏主意。在您的情况下,它会使您的程序失败,因为它不会释放线程堆栈的内存。当程序消耗了所有可用的虚拟内存并且CreateThread()无法为另一个线程保留足够的内存时,就会出现故障。只有在退出程序时才使用TerminateThread。
你必须以更聪明的方式做到这一点。通过通过发信号通知请求线程很好地退出,或者仅通过消耗这样昂贵的系统资源来处理文件。一个简单的计时器和一个线程也可以做到这一点。