长期运行中的CreateThread失败

时间:2011-08-05 08:12:51

标签: c++ multithreading winapi

我正在使用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;
}

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

1 个答案:

答案 0 :(得分:4)

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

你必须以更聪明的方式做到这一点。通过通过发信号通知请求线程很好地退出,或者仅通过消耗这样昂贵的系统资源来处理文件。一个简单的计时器和一个线程也可以做到这一点。