关于Fatal Error in GC : Too Many threads

本文介绍了一个程序在网络状况不佳时出现TooManyThreads错误的问题及解决方案。通过调整代码逻辑,确保了WWW请求能够有序进行,避免了因网络延迟造成的线程堆积。

之前写的某个程序在一台机子上测试一直出现这个问题,换一台则不会出现。也查不出是什么原因。开始以为是电脑问题,后来发现在网络好的地方就不会出现,网络差的地方则经常出现。在翻代码的时候发现有一个StartCoroutine写在了Update中,其中调用了WWW类,每调用一次Update就会开一个线程调用WWW,在网络好的情况下WWW可以及时返回,不会出现过多的线程,一旦网络情况比较糟糕,这边一直在开线程,那边又在等待线程返回,导致线程过多,出现”Too Many threads”的情况,我采用的解决办法是将WWW的调用放在一个while(true)中,每次调用WWW都必须等待上一次WWW返回。

Building Library\Bee\artifacts\WebGL\GameAssembly\master_WebGL_wasm\q8hu1z4zd3j6.o failed with output: E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50701:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50704:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50707:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50710:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50713:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50716:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50719:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50722:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50725:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50728:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50731:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50734:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50737:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50740:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50743:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50746:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50749:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50752:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ E:\GAJ\gcwj\GAJ_ZHDD_WEB\Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Assembly-CSharp.cpp:50755:54: error: token is not a valid binary operator in a preprocessor subexpression #if FORCE_PINVOKE_INTERNAL || FORCE_PINVOKE_HCNetSDK _INTERNAL ~~~~~~~~~~~~~~~~~~~~~~ ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] 20 errors generated. emcc2: error: '"D:/Program Files (x86)/unity2022/2021.3.44f1c1/Editor/Data/PlaybackEngines/WebGLSupport/BuildTools/Emscripten/llvm\clang++.exe" -target wasm32-unknown-emscripten -DEMSCRIPTEN -fno-inline-functions -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-cxx-exceptions -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -D__EMSCRIPTEN_major__=2 -D__EMSCRIPTEN_minor__=0 -D__EMSCRIPTEN_tiny__=19 -D_LIBCPP_ABI_VERSION=2 -Dunix -D__unix -D__unix__ -Werror=implicit-function-declaration -Xclang -iwithsysroot/include/SDL "--sysroot=D:\Program Files (x86)\unity2022\2021.3.44f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\cache\sysroot" -Xclang -iwithsysroot/include\compat -D__webgl__ -Wno-c++11-extensions -Wno-nonportable-include-path -ffunction-sections -fno-unwind-tables -fomit-frame-pointer -fno-threadsafe-statics -std=c++11 -Wno-#warnings -Wswitch -Wno-trigraphs -Wno-tautological-compare -Wno-invalid-offsetof -Wno-implicitly-unsigned-literal -Wno-integer-overflow -Wno-shift-negative-value -Wno-unknown-attributes -Wno-implicit-function-declaration -Wno-null-conversion -Wno-missing-declarations -Wno-unused-value -Wno-pragma-once-outside-header -fvisibility=hidden -fexceptions -fno-rtti -fno-strict-overflow -ffunction-sections -fdata-sections -fmessage-length=0 -pipe -DBASELIB_INLINE_NAMESPACE=il2cpp_baselib -DIL2CPP_MONO_DEBUGGER_DISABLED -DRUNTIME_IL2CPP -DHAVE_BDWGC_GC -DNDEBUG -I. -IE:/GAJ/gcwj/GAJ_ZHDD_WEB/Library/Bee/artifacts/WebGL/il2cppOutput/cpp "-ID:/Program Files (x86)/unity2022/2021.3.44f1c1/Editor/Data/il2cpp/libil2cpp/pch" "-ID:/Program Files (x86)/unity2022/2021.3.44f1c1/Editor/Data/il2cpp/libil2cpp" "-ID:/Program Files (x86)/unity2022/2021.3.44f1c1/Editor/Data/il2cpp/external/baselib/Include" "-ID:/Program Files (x86)/unity2022/2021.3.44f1c1/Editor/Data/il2cpp/libil2cpp/os/ClassLibraryPAL/brotli/include" "-ID:/Program Files (x86)/unity2022/2021.3.44f1c1/Editor/Data/il2cpp/external/baselib/Platforms/WebGL/Include" -Oz -fcolor-diagnostics -fdiagnostics-absolute-paths -UGC_THREADS -UUSE_MMAP -UUSE_MUNMAP -c -xc++ E:/GAJ/gcwj/GAJ_ZHDD_WEB/Library/Bee/artifacts/WebGL/il2cppOutput/cpp/Assembly-CSharp.cpp -o Library/Bee/artifacts/WebGL/GameAssembly/master_WebGL_wasm/q8hu1z4zd3j6.o' failed (1) UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)
07-23
错误代码 C1014(`too many include files: depth = 1024`)表明在编译过程中包含文件的嵌套深度达到了编译器所允许的最大值(这里是 1024 层),通常是由头文件的循环包含或者过度嵌套包含导致的。以下是一些解决此问题的方法: ### 避免头文件的循环包含 头文件的循环包含是指两个或多个头文件相互包含,形成一个循环,这会导致无限的嵌套包含。可以使用预处理器指令(如 `#ifndef`、`#define`、`#endif`)或者 `#pragma once` 来防止头文件的重复包含。 #### 使用 `#ifndef`、`#define`、`#endif` ```cpp // example.h #ifndef EXAMPLE_H #define EXAMPLE_H // 头文件内容 #endif // EXAMPLE_H ``` #### 使用 `#pragma once` ```cpp // example.h #pragma once // 头文件内容 ``` ### 减少不必要的包含 检查代码中是否有不必要的头文件包含。有些头文件可能在某些源文件中并不需要,将其移除可以减少包含文件的数量和嵌套深度。 ### 前置声明 对于类和结构体,如果只需要声明指针或引用,而不需要完整的定义,可以使用前置声明来代替包含头文件。 ```cpp // 前置声明 class MyClass; // 使用 MyClass 的指针或引用 void func(MyClass* obj); ``` ### 拆分大型头文件 如果一个头文件包含了大量的代码和其他头文件,可以考虑将其拆分成多个较小的头文件,这样可以减少每个源文件包含的内容。 ### 检查构建系统 确保构建系统(如 Makefile、CMake 等)没有错误地重复包含头文件。有时候构建系统的配置问题也可能导致头文件被多次包含。 ### 检查第三方库 如果使用了第三方库,确保这些库的头文件包含方式正确,并且没有引入不必要的嵌套包含。 ### 增加编译器的嵌套深度限制(不推荐) 有些编译器允许通过命令行选项来增加嵌套深度的限制,但这只是一个临时的解决方案,不建议长期使用,因为它并没有解决根本问题。例如,在 Visual Studio 中可以使用 `/Zm` 选项来增加嵌套深度限制: ```sh cl /Zm2048 your_file.cpp ``` 通过以上方法,可以有效地解决 `fatal error C1014: too many include files: depth = 1024` 错误。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值