CreateThread在长期运行中失败 我用C++编写了一个程序,用WiAPI监视某个目录,让新文件到达,并按一定顺序发送。这些文件来自一个实时视频流,因此一个单元中有2个文件-音频文件和视频文件,单元应按顺序发送。A.KA.(1.mp3,1.avi);(2.mp3,2.avi)。。。架构是:

CreateThread在长期运行中失败 我用C++编写了一个程序,用WiAPI监视某个目录,让新文件到达,并按一定顺序发送。这些文件来自一个实时视频流,因此一个单元中有2个文件-音频文件和视频文件,单元应按顺序发送。A.KA.(1.mp3,1.avi);(2.mp3,2.avi)。。。架构是:,c++,multithreading,winapi,C++,Multithreading,Winapi,1) 检测添加到文件夹中的新文件,将文件名插入输入队列 2) 将文件组织成单元,将单元插入单元队列 3) 逐单位发送 但是,由于我必须使用监控文件目录来监视添加的文件,我需要确保该文件是完整的。KA.它已准备好发送,因为该信号在创建文件时出现,但尚未填充信息并关闭。所以,我从输入队列中弹出文件名,要么是当队列中有超过1个文件时(也就是说,创建的下一个文件发出了信号,这意味着上一个文件已准备好发送),要么是在超时时(10秒),所以任何文件都应该在10秒钟内完成 所以一般来说,这个程序运行正常。但是

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

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

3) 逐单位发送

但是,由于我必须使用监控文件目录来监视添加的文件,我需要确保该文件是完整的。KA.它已准备好发送,因为该信号在创建文件时出现,但尚未填充信息并关闭。所以,我从输入队列中弹出文件名,要么是当队列中有超过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个单元后,我的程序会给我“时间错误”消息,如果我是对的,这意味着程序无法分配线程。但在这段代码中,程序在目录中创建文件后,会完全终止计时器线程。所以我对这个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;
}

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

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


你得用更聪明的方法来做。或者通过发出事件信号来请求线程顺利退出,或者仅仅为了处理文件而不消耗如此昂贵的系统资源。一个简单的计时器和一个线程也可以做到这一点。

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


你得用更聪明的方法来做。或者通过发出事件信号来请求线程顺利退出,或者仅仅为了处理文件而不消耗如此昂贵的系统资源。一个简单的计时器和一个线程也可以做到这一点。

调用
TerminateThread()
是一个非常糟糕的主意。我不知道这是否会引起你的问题,但你不应该定期打电话给它。嗯。。。还有其他命令吗?我如何终止孩子?我已经看到terminateThread()太粗糙了,不能频繁调用,但我还没有找到任何其他命令来执行它。您无法强制终止线程并确保安全。要么期望线程自行结束,要么运行单独的进程并终止后者。期望线程结束并不是那么糟糕-您使用一个具有互锁访问的共享变量,线程会定期检查该变量,一旦从主线程设置了该变量,其他线程就会退出。在任何程序中使用800个线程都不是一个好主意。您不能创建一组在输入队列上工作的工作线程吗?它们必须在输入队列上相互竞争,所以越小越好。除非您确切知道自己在做什么,否则不要使用
CreateThread()
。这可能与你目前的情况无关,但它可能会在以后为你制造问题。请参阅此讨论:调用
TerminateThread()
是一个非常糟糕的主意。我不知道这是否会引起你的问题,但你不应该定期打电话给它。嗯。。。还有其他命令吗?我如何终止孩子?我已经看到terminateThread()太粗糙了,不能频繁调用,但我还没有找到任何其他命令来执行它。您无法强制终止线程并确保安全。要么期望线程自行结束,要么运行单独的进程并终止后者。期望线程结束并不是那么糟糕-您使用一个具有互锁访问的共享变量,线程会定期检查该变量,一旦从主线程设置了该变量,其他线程就会退出。在任何程序中使用800个线程都不是一个好主意。您不能创建一组在输入队列上工作的工作线程吗?它们必须在输入队列上相互竞争,所以越小越好。除非您确切知道自己在做什么,否则不要使用
CreateThread()
。这可能与你目前的情况无关,但它可能会在以后为你制造问题。查看此讨论:我不知道
TerminateThread()
没有释放线程堆栈。我知道很多其他的问题,但不是这个问题。你有什么推荐信吗。它就在MSDN文档的备注部分。我不知道
TerminateThread()
没有释放线程堆栈。我知道很多其他的问题,但不是这个问题。你有什么推荐信吗。它就在MSDN文档的备注部分。