- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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/
当我尝试使用CreateThread函数时,我遇到了一个奇怪的错误。这是我的代码: HANDLE threads[3]; //threads[0] is printer, threads[1] is
CreateThread 返回一个HANDLE 对象,需要通过CloseHandle 关闭 文档指出,线程对象保留在系统中,直到线程终止并且通过调用 CloseHandle 关闭线程的所有句柄。 我的
我将 struct 传递给 CreateThread() 函数。另一台机器上的相同代码工作正常。但是在我的机器上,“SendItem”总是变成 0xccccccc Bad Ptr>。有谁知道为什么?
我目前正在从事一个项目,我们使用 pthreads 为 UNIX 系统实现 C 线程。现在我们也希望能够在 Windows 上运行整个项目,我正在翻译 WIN32 的所有线程。现在我遇到了一个问题,我
我在创建数千个线程并关闭它时遇到问题。看一下这段代码: HANDLE threadHandles[i]; for(int i = 0; i < 1000; i++) { CreateThrea
#include DWORD Menuthread(LPVOID in) { return 0; } int main() { CreateThread(NULL, NULL, Menuth
我正在尝试使用 C++ 创建异步服务器监听器我是 C++ 的新手,但我必须做这个项目,我是 Web 开发人员 (PHP),但 PHP 无法建立异步连接+他是一个非常糟糕的大型语言连接量...我可以编写
我正在创建一个线程,它可以控制所有程序过程消息并且不会卡住程序。我写了this code我得到了 program not responding。 有没有人有使用线程的经验可以帮助我? 最佳答案 Win
我正在使用 VC++ 2012 Express 创建一个多线程聊天客户端-服务器。代码改编自此处:http://www.codeproject.com/Articles/14032/Chat-Clie
我想在一个类中启动一个线程,该线程将调用一个函数,该函数是同一类的成员。以下是我要构建的示例代码。 void CM::ExecuteIt() { // Some Calculations if(/*C
这是我第一次与 windows 打交道。我尝试创建线程,但无法编译我的代码。 这是我的代码的一部分: WORD _tid; HANDLE readerThread= CreateThread(0,0
如何给CreateThread回调函数传递int参数?我试了一下: DWORD WINAPI mHandler(LPVOID sId) { ... arr[(int)sId] ... } int id
当我使用CreateThread API方法时,我需要做什么在传递 LPVOID lpParameter 的地方传递多个参数? 最佳答案 您可以创建一个包含所有相关数据的结构,并将指向该结构实例的指针
问题: 如何传递具体两个参数给CreateThread , 何时: 参数一,类型为SOCKET 参数二,一个接口(interface)指针: _COM_SMARTPTR_TYPEDEF(Range,
我只是想知道究竟是什么因素影响了 createthread 的执行速度,以及它必须存活多长时间才能使其“值得”。 背景:我应该在游戏循环中的什么地方生成线程? 最佳答案 主游戏循环不是产生工作线程的地
我正在尝试创建 4 个线程以在我的 4 个 CPU 内核上同时运行一个函数。我调用的函数将根据 val 变量值更改一些循环偏移量。 我试过了,但是它没有正确地增加 val 计数器,一些线程报告相同的值
CreateThread Windows API 函数的保留参数和提交参数有什么区别? 我无法理解以下几行.. The reserve argument sets the amount of addr
我们知道在Windows下创建一个线程的方法有两种,一种就是调用Windows API CreateThread()来创建线程;另外一种就是调用MSVC CRT的函数_beginthread()或_
我在调用 CreateThread 时将类引用作为参数传递给 ThreadProc 时遇到问题。这是一个示例程序,演示了我遇到的问题: program test; {$APPTYPE CONSOLE}
#include #include #include #include #include #include void Thread1( LPVOID param) {
我是一名优秀的程序员,十分优秀!