我一直在阅读多线程和共享资源访问,其中一个(对我而言)新概念是互斥锁.我似乎无法找到的是发现"临界区"被锁定的线程实际发生的情况.它说在许多地方线程被"阻止",但这意味着什么?是否暂停,锁定解除后会恢复吗?或者它会在"运行循环"的下一次迭代中再次尝试?
我问的原因是因为我想要系统提供的事件(鼠标,键盘等),它们(显然)在主线程上传递,在我的辅助线程的运行循环中的一个非常特定的部分处理.因此无论发生什么事件,我都会在自己的数据结构中排队.显然,数据结构需要一个互斥锁,因为它被两个线程修改.缺少的难题是:当事件在主线程上的函数中传递时会发生什么,我想将其排队,但是队列被锁定了?主线程是否会被暂停,还是会跳过锁定的部分并超出范围(丢失事件)?
我知道这个主题在SO上引起了很多关注,但没有一个"解决方案"对我有用.情况如下:
iPad在我的桌面上是平的(面朝上的设备方向),主屏幕是完全可读的,但主页按钮在顶部.所以这有效地显示了"Portrait Up Side Down" 界面方向.
我开始我的应用程序
该应用程序调用beginGeneratingDeviceOrientationNotifications以确保加速计正在工作,并且方向通知进入.
在启动时,我的应用程序会查询"界面方向"和"设备方向".结果是:
STARTUP ORIENTATION:
INTERFACE ORIENTATION: UIInterfaceOrientationPortrait
DEVICE ORIENTATION: UIDeviceOrientationFaceUp
Run Code Online (Sandbox Code Playgroud)
Apple文档说每个应用程序(界面?)都是纵向开始的,所以这很有意义.设备方向也是正确的,因为这确实是正面朝上的.
发布后,第一个方向通知即将进入:
NOTIFICATION 1:
INTERFACE: UIInterfaceOrientationPortrait
DEVICE: UIDeviceOrientationPortrait
Run Code Online (Sandbox Code Playgroud)
再一次,界面的肖像(这与我期望的相反,主屏幕显示自己向上朝下的方向),该设备也被称为纵向(不是这样,但这是显而易见的一个聪明的方案,以解决当设备面朝上或朝下时如何定位应用程序的内容).
正如许多人提到的那样,另一个(只有一个,而不是两个)方向通知如下:
NOTIFICATION 2:
INTERFACE: UIInterfaceOrientationPortrait
DEVICE: UIDeviceOrientationFaceUp
Run Code Online (Sandbox Code Playgroud)
接口仍然是纵向(而不是正面向下),并且设备面朝上(这是正确的).
我的应用程序正确调整自己,并显示在一边,这是完全错误的.
我该怎么做才能知道上一个已知的方向,主屏幕和iPad上的其他用户界面显示的方向?
这是一个只有窗口和视图的OpenGL应用程序.我已经在混合中添加了一个UIViewController来查看它是否提供了更准确的信息,但它只是相同而且错误.我知道我并不是唯一一个在这方面苦苦挣扎的开发者,因为我在iPad上的许多应用程序也做错了,你必须倾斜设备才能使它们正确定位.但有些应用确实似乎做对了,秘诀是什么?
当我编译我的iOS应用程序的发布版本(基于标准的Apple提供的iOS应用程序模板)时,查看生成的可执行二进制文件,我看到各种符号甚至本地cpp源文件和标题路径.我真的很难过为什么会这样(我没有启用RTTI*).特别是源文件路径让我感到不舒服在全球范围内发送这个应用程序(为什么每个人都能看到我的开发机器的目录布局?).
这是两个(随机选择,主持)摘录:
TS/../ACTORS/CActorCanvasCharPart.cpplastMeshcapVerticesOFF BOUNDSupload VERTICES: %d
20CActorCanvasCharPartgrassscrub/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_grass.cppbaseShadowmowerstartmowerloopmowermowerCharcutGrassChargrassStuffgrassParticles/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_grass.h17CStateGame2_grasssinwriteStroke/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_flowers.hflowerBedsandTrailclickstart3inplace2sandDrag/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame
以下是自定义类型和结构的许多符号:
CAssetMgr="_vptr$CMgrBase"^^?"pMain"^{CMain}"inited"B"curveCount"S"curveSpecs"^{CCurveSpec}"gameSpecs"[23{CGameStateSpec="header"{SpecDiskHeader="type"i"version"S}"gameID"C"backgroundColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"clickPointColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"clickPointIconColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"hintColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}}]"currentFont"^{CCharset}"userCharParts"^^{CCharPart}"words"{CDataSet<CName4,CCharArray>="_vptr$CObjectBase"^^?"pMain"^{CMain}"count"i"data"*"dataSize"l}"sets"{CDataSet<CName16,CCharArray>="_vptr$CObjectBase"^^?"pMain"^{CMain}"count"i"data"*"dataSize"l
这可以避免,怎么样?
*更新:我刚发现RTTI默认开启.所以我清理了目标,禁用了RTTI(GCC_ENABLE_CPP_RTTI = NO)并重新编译.我仍然在二进制文件中看到很多符号和源路径.
更新2:我从应用程序商店检查了一些其他应用程序,其中许多也显示了他们的源文件路径.非常可怕,如果你问我:
Joined Up Lite
/Users/lloydy/Documents/Development/iPhone/ABC Joined Up/main.m
/Users/lloydy/Documents/Development/iPhone/ABC Joined Up/Classes/SettingsView.m
Crayon Physics
/Users/smproot/Desktop/unzip/CrayonPhysics/v104/Classes/crayon/src/ceng/gameutils/killspriteslowly/killspriteslowly.cpp
/Users/smproot/Desktop/unzip/CrayonPhysics/v104/Classes/crayon/src/ceng/tasks/task/sdl/mixer/ctaskaudiosdlmixer.cpp
Wall Times
/Users/fred/_WORK/ZDNDRP/WallTimes/main.m
/Users/fred/_WORK/ZDNDRP/WallTimes/Classes/SystemCategories.m
Jumbo Calculator
/Users/Christopher/Documents/Development/JumboCalculator 1.0.3/main.m
/Users/Christopher/Documents/Development/JumboCalculator 1.0.3/Classes/CalculatorFaceViewController.m
当我在Intel机器上运行以下C代码时......
float f = -512;
unsigned char c;
while ( f < 513 )
{
c = f;
printf( "%f -> %d\n", f, c );
f += 64;
}
Run Code Online (Sandbox Code Playgroud)
...输出如下:
-512.000000 -> 0
-448.000000 -> 64
-384.000000 -> 128
-320.000000 -> 192
-256.000000 -> 0
-192.000000 -> 64
-128.000000 -> 128
-64.000000 -> 192
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> …Run Code Online (Sandbox Code Playgroud)