Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用Cython中的键盘中断“while loop”_C++_Python_Interrupt_Cython_Keyboard Events - Fatal编程技术网

C++ 用Cython中的键盘中断“while loop”

C++ 用Cython中的键盘中断“while loop”,c++,python,interrupt,cython,keyboard-events,C++,Python,Interrupt,Cython,Keyboard Events,我希望能够使用cython中断一个长函数,使用通常的CTRL+C中断命令。 我的C++长函数在Cython代码中反复调用while循环,但是我希望在循环期间发送一个“中断”并阻止while循环。 中断还应等待longFunction()完成,以便没有数据丢失或保持未知状态 这是我的第一个实现,显然不起作用: computed=0; print "Computing long function..." while ( computed==0 ): try:

我希望能够使用cython中断一个长函数,使用通常的CTRL+C中断命令。 我的C++长函数在Cython代码中反复调用while循环,但是我希望在循环期间发送一个“中断”并阻止while循环。 中断还应等待longFunction()完成,以便没有数据丢失或保持未知状态

这是我的第一个实现,显然不起作用:

computed=0;

print "Computing long function..."
    while ( computed==0 ):
        try:
            computed = self.thisptr.aLongFunction()
        except (KeyboardInterrupt, SystemExit):
            computed=1
            print '\n! Received keyboard interrupt.\n'
            break;

(p.s.
self.thisptr
是指向当前类的指针,该类实现了
aLongFunction()

您应该能够执行以下操作:

import signal

class Test():
    def __init__(self):
        self.loop_finished = False
        signal.signal(signal.SIGINT, self.abort_loop)

    def abort_loop(self, signal, frame):
        self.loop_finished = True

    def go(self):
        while not self.loop_finished:
            print "Calculating"

            # Do your calculations
            # Once calcations are done, set self.loop_finished to True

        print "Calculating over"

Test().go()

您还可以使用其他变量来跟踪计算是否被手动中止。

我不是Python C-Api foo大师,但是这是可行的,但可能不是最好的方法:

cdef extern from "Python.h":
    int PyErr_CheckSignals()

def test_interrupt():
    cdef int i = 0
    while i < 9999999999 and not PyErr_CheckSignals():
        # do fancy stuff.
        i += 1

另请参见

您要做的是捕获
SIGINT
。看,嗯,这个解决方案不适用于我的函数…循环没有停止我发布了一个答案,让我知道它是否有效。我在为我的类设置属性时遇到了问题,因为我的类是一个cdef类(我使用Cython),当我在cinit中设置类属性时,我发现属性是只读的。我在Cython中做得很少,我(可能是愚蠢的)假设它也会起同样的作用。希望其他人能帮助你。一种可能有效的方法是将
loop\u finished
设置为
[False]
,在
abort\u loop
中使用
self.loop\u finished[0]=True
并在
中检查
loop\u finished[0]的真值
。如果cython的int是可变的,您可以简单地将
循环\u finished
增加1,而不是将其设置为
True
。为什么要寻址
self.loop\u finished[0]
?不是数组或list@linello,你真的看到了吗?我添加了Exception*的东西,我认为这会更好,但我没有尝试。我认为这样的方法也应该有效,但前提是它可能是Cython函数。
cdef function(...) except *:
    pass