我正在用C++编写一个程序,使用WINAPI来监视某些目录中的新文件,并按一定的顺序发送它们。这些文件是从一个实时视频流中派生出来的,因此在一个单元中有两个文件--音频文件和视频文件,单元应该按顺序发送。(1.mp3,1.avi);(2.mp3,2.avi)建筑是:
1)检测新文件添加到文件夹中的,将文件名插入输入队列
2)将文件组织为单元,将单元插入到单元队列中。
( 3)逐个单位发送
但是,由于我必须为在那里添加的文件使用监视文件目录,所以我需要确保文件是完整的,也就是说,它已经准备好发送了,因为当文件创建时会出现信号,但是它还没有被信息填充并关闭。因此,我从输入队列中弹出文件名,无论是当队列有超过一个文件时(例如,为下一个文件创建的信号,这意味着前面的文件已准备好发送)或超时(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;
}请大家给我一些解决这个问题的建议好吗?提前谢谢。
发布于 2011-08-05 08:26:53
在许多方面,使用TerminateThread是个坏主意。在您的情况下,它使您的程序失败,因为它没有释放线程堆栈的内存。当程序消耗了所有可用的虚拟内存,而CreateThread()无法为另一个线程预留足够的内存时,就会失败。只有在退出程序时才使用TerminateThread。
你得用更聪明的方法。要么通过发送事件信令请求线程很好地退出,要么仅仅为了处理文件而不消耗如此昂贵的系统资源。一个简单的计时器和一个线程也可以做到这一点。
https://stackoverflow.com/questions/6953319
复制相似问题