小编zne*_*eak的帖子

5
推荐指数
1
解决办法
2963
查看次数

Python:等待按键或直到超时

我在终端会话中有一个长时间运行的Python脚本(主机是一个FreeBSD盒子),它每9分钟执行一次任务.现在,我希望能够随时中断该睡眠呼叫,以便它立即执行任务.

我怎样才能做到这一点?捕捉Ctrl+ C不是一个选项,因为我需要它来停止程序(而不是仅仅打断睡眠).我可以用终端窗口和键盘做的任何其他事情都可以.

python

5
推荐指数
1
解决办法
2665
查看次数

使用CoreAnimation减慢和加速动画

我正在尝试将慢动作效果应用到我的应用程序,就像你按下Shift键如何减慢Mac OS的大多数图形效果一样.

我的应用程序使用CoreAnimation,所以我认为它应该没什么大不了的:设置speed为一些较慢的值(比如0.1)并将其设置回1一旦我完成,然后我就去了.

不幸的是,这似乎不是正确的方法.减速效果很好,但是当我想恢复到正常速度时,它会恢复速度,就像速度1一样.这基本上意味着如果我按住Shift足够长的时间,只要我释放它,动画就会立即完成.

我找到了一个技术质量保证页面,解释了如何暂停和恢复动画,但如果它不是完全暂停动画,我似乎无法做到正确.我在时间扭曲方面肯定不是很擅长.

什么是减速然后使用CoreAnimation恢复动画的正确方法?

这是有用的代码:

-(void)flagsChanged:(NSEvent *)theEvent
{
    CALayer* layer = self.layer;
    [CATransaction begin];
    CATransaction.disableActions = YES;
    layer.speed = (theEvent.modifierFlags & NSShiftKeyMask) ? 0.1 : 1;
    [CATransaction commit];
}
Run Code Online (Sandbox Code Playgroud)

core-animation

5
推荐指数
1
解决办法
1749
查看次数

如何在Mac OS X上调试互斥锁问题?

我试图让gdb/lldb存根为我正在制作的程序工作,现在它似乎使调试器死锁,所以我(讽刺地)在我的机器上调试lldb以试图找出出错的地方.

lldb试图锁定一个互斥锁,似乎就此陷入僵局.

在Windows上,我知道你可以在内核调试模式中使用WinDBG魔术来找出谁首先获得了互斥锁,而在Linux上我知道这pthread_mutex_t不是不透明的,你可以用它来弄清楚哪个线程非常简单.

Mac OS X怎么样?如果我想知道哪个线程拥有互斥锁,我该怎么办?

为了记录,我尝试在opensource.apple.com上搜索互斥结构的实际定义,没有太多运气,但这并不意味着它不存在.

macos multithreading mutex

5
推荐指数
0
解决办法
372
查看次数

如何使用imul指令计算符号标志?

imul文档指出:

根据目标中操作数大小截断结果的最高位更新SF.

对于64位操作,那么,我的理解是SF = (a * b) >> 63,或者更简单的是,如果ab签名,SF = a * b < 0.

但是,我得到一个意想不到的结果乘以两个大数:

mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx
Run Code Online (Sandbox Code Playgroud)

结果0x9090909090909095 * 0x40404040404040430xefcba7835f3b16ff.它设置了符号位,但SF imul指令在指令后被清除.这是怎么回事?


这是不久前交叉发布到英特尔论坛的.

x86 assembly

5
推荐指数
1
解决办法
612
查看次数

如何确保以正确的顺序初始化全局变量?

我有全局变量,其构造函数依赖于不同翻译单元中的其他全局变量.我的理解是全局变量的初始化顺序是未指定的,因此这不安全.

我怎样才能确保我们需要的全局变量最迟在首次访问时被初始化?例如,如果我在函数中创建一个静态变量并调用该函数来获取引用,它是否会在第一次执行函数时被初始化?

c++ c++14

5
推荐指数
1
解决办法
440
查看次数

如何在Mac OS X的可执行文件中嵌入二进制文件的内容?

我的命令行程序的生成过程生成一个二进制文件(超过500KB),当前必须由argv的路径引用该文件。我想将此文件嵌入可执行文件中。

在Linux上,似乎可以用来objcopy从二进制文件制作目标文件:

objcopy --input binary --output elf32-i386 --binary-architecture i386 myfile.dat myfile.o
Run Code Online (Sandbox Code Playgroud)

但是,OS X开发人员工具链不包含objcopy命令。如果不安装binutils,有什么可能?

我从Xcode构建项目,并使用自定义构建规则生成文件。

macos xcode objcopy

5
推荐指数
2
解决办法
1034
查看次数

rip 可以与具有 RIP 相对寻址的另一个寄存器一起使用吗?

我熟悉这种形式的内存引用:

XXX ptr [base + index * size + displacement]
Run Code Online (Sandbox Code Playgroud)

其中XXX是一些尺寸(字节/字/ DWORD /等),两者baseindex是寄存器,size为二的小功率,并且displacement是带符号的值。

amd64 引入了 rip 相对寻址。据我了解,我应该可以rip用作基址寄存器。但是,当我使用 clang-900.0.39.2 尝试此操作时:

mov r8b, byte ptr [rip + rdi * 1 + Lsomething]
Run Code Online (Sandbox Code Playgroud)

我得到:

错误:无效的基数+索引表达式

mov r8b, byte ptr [rip + rdi * 1 + Lsomething]
Run Code Online (Sandbox Code Playgroud)

rip用作基址寄存器时是否不能使用索引寄存器?我是否必须使用lea计算rip + Lsomething然后抵消它?

assembly x86-64 addressing-mode

5
推荐指数
1
解决办法
1225
查看次数

我在哪里可以在 Swift 中注册 ValueTransformer?

我正在尝试在我的应用程序打开的第一个窗口使用的 Swift 中使用ValueTransformer(né NSValueTransformer)。值转换器需要先注册,ValueTransformer.registerValueTransformer(_:forName:)然后才能被用户界面运行时查询。

的文档NSValueTransformer 建议+[AppDelegate initialize]. 但是,Swift 不允许您覆盖+initialize. 我试图从applicationWillFinishLaunching(_)and注册applicationDidFinishLaunching(_),但它们都发生得太晚了,我的窗口没有被填满,因为运行时找不到值转换器。

我应该在哪里注册我的价值转换器?

macos cocoa swift

5
推荐指数
2
解决办法
732
查看次数

现在的C和C++编译器的线程保证是什么?

我想知道编译器有什么保证可以确保对内存的线程写入在其他线程中具有可见效果.

我知道无数的情况,这是有问题的,我敢肯定,如果你有兴趣回答你也知道它,但请关注我将要呈现的案件.

更确切地说,我担心可能导致线程丢失其他线程完成的内存更新的情况.我不关心(此时)更新是非原子的还是非常同步的:只要相关的线程注意到更改,我会很高兴.

我希望编译器区分两种变量访问:

  • 访问必须具有地址的变量;
  • 访问不一定具有地址的变量.

例如,如果您使用此代码段:

void sleepingbeauty()
{
    int i = 1;
    while (i) sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

既然i是本地的,我认为我的编译器可以优化它,只是让沉睡的美丽陷入永恒的沉睡.

void onedaymyprincewillcome(int* i);

void sleepingbeauty()
{
    int i = 1;
    onedaymyprincewillcome(&i);
    while (i) sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

既然i是本地的,但是它的地址被接受并传递给另一个函数,我假设我的编译器现在知道它是一个"可寻址的"变量,并生成内存读取以确保可能有一天王子会来.

int i = 1;
void sleepingbeauty()
{
    while (i) sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

由于i是全局的,我假设我的编译器知道变量有一个地址,并将生成读取而不是缓存该值.

void sleepingbeauty(int* ptr)
{
    *ptr = 1;
    while (*ptr) sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

我希望dereference运算符足够明确,让我的编译器在每次循环迭代时生成一个内存读取.

我很确定这是生产中每个C和C++编译器使用的内存访问模型,但我认为没有任何保证.事实上,C++ 03甚至对线程的存在视而不见,所以这个问题在标准时甚至都没有意义.不过我对C不太确定.

是否有一些文件指明我是对还是错?我知道这些都是泥泞的水域,因为这些可能不符合标准,对我来说这似乎是一个重要的问题.

除了编译器生成读取之外,我还担心CPU缓存在技术上可能会保留一个过时的值,即使我的编译器尽力使读取和写入,值也不会在线程之间同步.这会发生吗?

c c++ multithreading

4
推荐指数
1
解决办法
252
查看次数