gpt4 book ai didi

c++ - 长期运行时 CreateThread 失败

转载 作者:行者123 更新时间:2023-11-30 02:08:23 27 4
gpt4 key购买 nike

我正在用 C++ 编写一个程序,使用 WINAPI 来监视特定目录中是否有新文件到达,并按特定顺序发送它们。这些文件来自直播视频流,因此一个单元中有 2 个文件 - 音频文件和视频文件,并且单元应按顺序发送。 A。 k. A。 (1.mp3, 1.avi); (2.mp3, 2.avi)...架构是:

1) 检测到文件夹添加的新文件,将文件名插入输入队列

2) 将文件组织成单元,将单元插入单元队列

3) 逐单元发送

但由于我必须使用监视文件目录来监视那里添加的文件,所以我需要确保该文件是完整的,a。 k. 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;
}

请这里的任何人给我一些建议如何解决这个错误?提前致谢。

最佳答案

使用 TerminateThread 在很多方面都是一个坏主意。在您的情况下,它会使您的程序失败,因为它不会释放线程堆栈的内存。当您的程序消耗了所有可用的虚拟内存并且 CreateThread() 无法为另一个线程保留足够的内存时,就会失败。仅在退出程序时使用 TerminateThread。

您必须以更智能的方式执行此操作。要么通过发出事件信号要求线程正常退出,要么不消耗如此昂贵的系统资源来处理文件。一个简单的计时器和一个线程也可以做到这一点。

关于c++ - 长期运行时 CreateThread 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6953319/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com