首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateThread长期运行失败

CreateThread长期运行失败
EN

Stack Overflow用户
提问于 2011-08-05 08:12:50
回答 1查看 735关注 0票数 1

我正在用C++编写一个程序,使用WINAPI来监视某些目录中的新文件,并按一定的顺序发送它们。这些文件是从一个实时视频流中派生出来的,因此在一个单元中有两个文件--音频文件和视频文件,单元应该按顺序发送。(1.mp3,1.avi);(2.mp3,2.avi)建筑是:

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

2)将文件组织为单元,将单元插入到单元队列中。

( 3)逐个单位发送

但是,由于我必须为在那里添加的文件使用监视文件目录,所以我需要确保文件是完整的,也就是说,它已经准备好发送了,因为当文件创建时会出现信号,但是它还没有被信息填充并关闭。因此,我从输入队列中弹出文件名,无论是当队列有超过一个文件时(例如,为下一个文件创建的信号,这意味着前面的文件已准备好发送)或超时(10秒),因此任何文件都应该执行10秒。

因此,一般来说,这个程序运行和工作正常。但是,如果我假设发送过程将花费太长的时间,那么单元队列就会增长。在单元队列中缓冲了一定数量的单元后,就会出现错误。

代码语言:javascript
复制
    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个单元后,我的程序给出了“时间错误”消息,如果我是对的,这意味着程序不能分配线程。但是在此代码中,程序完全在文件在目录中创建之后终止计时器线程。所以我有点被这个虫子搞混了。同样有趣的是,即使有这个时间错误,我的程序仍然像往常一样发送单元,所以这看起来不像是操作系统错误或其他什么,它是错误的线程声明/终止,至少在我看来是这样的。如果有帮助的话,还可以在下面提供计时器代码。

代码语言:javascript
复制
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;
}

请大家给我一些解决这个问题的建议好吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-05 08:26:53

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6953319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档