- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我只是在 LEGO EV3 单元上尝试一些 MicroPython 脚本,我正在努力寻找任何文档/示例来告诉我如何检查线程是否正在运行。
def newMethod():
print("new method")
t1 = threading.Thread(target=newMethod)
while True:
...
if t1.is_alive() is False:
t1.start()
现在这可以工作了,除了测试 t1 是否已经启动。但是是Python2.7。值得庆幸的是,除了 is_alive 之外,它的大部分都在 microPython 中工作?我收到一个错误。
Traceback (most recent call last):
File "./micro.py", line 79, in <module>
File "./micro.py", line 73, in <module>
AttributeError: 'Thread' object has no attribute 'is_alive'
我需要手动跟踪吗?或者是否有像 python 2.7 这样的内置方法
最佳答案
is_alive
目前没有为任何支持线程的端口实现(在官方存储库中,不知道其他的)。所以你的选择是:
对于最后一个案例,我很好奇并想到了这个,对于 unix 端口,因为我没有乐高玩具,它将 is_alive
添加到 _thread
模块。从那时起,在您的 Threading
类中获取它应该相当容易。请注意,这只是为了让您了解它需要什么,并且是未经测试的概念证明,YMMV。补丁:
--- a/ports/unix/mpthreadport.c
+++ b/ports/unix/mpthreadport.c
@@ -174,7 +174,20 @@ void mp_thread_start(void) {
pthread_mutex_unlock(&thread_mutex);
}
-void mp_thread_create(void *(*entry)(void*), void *arg, size_t *stack_size) {
+int mp_thread_is_alive(void* id) {
+ int ready = 0;
+ pthread_mutex_lock(&thread_mutex);
+ for (thread_t *th = thread; th != NULL; th = th->next) {
+ if (th->id == (pthread_t)id && th->ready) {
+ ready = 1;
+ break;
+ }
+ }
+ pthread_mutex_unlock(&thread_mutex);
+ return ready;
+}
+
+void* mp_thread_create(void *(*entry)(void*), void *arg, size_t *stack_size) {
// default stack size is 8k machine-words
if (*stack_size == 0) {
*stack_size = 8192 * BYTES_PER_WORD;
@@ -225,7 +238,7 @@ void mp_thread_create(void *(*entry)(void*), void *arg, size_t *stack_size) {
pthread_mutex_unlock(&thread_mutex);
- return;
+ return (void*) th->id;
er:
mp_raise_OSError(ret);
diff --git a/py/modthread.c b/py/modthread.c
index 91237a7..246dd5c 100644
--- a/py/modthread.c
+++ b/py/modthread.c
@@ -264,9 +264,7 @@ STATIC mp_obj_t mod_thread_start_new_thread(size_t n_args, const mp_obj_t *args)
th_args->fun = args[0];
// spawn the thread!
- mp_thread_create(thread_entry, th_args, &th_args->stack_size);
-
- return mp_const_none;
+ return mp_obj_new_int_from_uint((uintptr_t)mp_thread_create(thread_entry, th_args, &th_args->stack_size));
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_thread_start_new_thread_obj, 2, 3, mod_thread_start_new_thread);
@@ -275,6 +273,11 @@ STATIC mp_obj_t mod_thread_exit(void) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_thread_exit_obj, mod_thread_exit);
+STATIC mp_obj_t mod_thread_is_alive(mp_obj_t id) {
+ return mp_obj_new_bool(mp_thread_is_alive((void*) mp_obj_get_int(id)));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_thread_is_alive_obj, mod_thread_is_alive);
+
STATIC mp_obj_t mod_thread_allocate_lock(void) {
return MP_OBJ_FROM_PTR(mp_obj_new_thread_lock());
}
@@ -287,6 +290,7 @@ STATIC const mp_rom_map_elem_t mp_module_thread_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_stack_size), MP_ROM_PTR(&mod_thread_stack_size_obj) },
{ MP_ROM_QSTR(MP_QSTR_start_new_thread), MP_ROM_PTR(&mod_thread_start_new_thread_obj) },
{ MP_ROM_QSTR(MP_QSTR_exit), MP_ROM_PTR(&mod_thread_exit_obj) },
+ { MP_ROM_QSTR(MP_QSTR_is_alive), MP_ROM_PTR(&mod_thread_is_alive_obj) },
{ MP_ROM_QSTR(MP_QSTR_allocate_lock), MP_ROM_PTR(&mod_thread_allocate_lock_obj) },
};
diff --git a/py/mpthread.h b/py/mpthread.h
index 602df83..46f1a3a 100644
--- a/py/mpthread.h
+++ b/py/mpthread.h
@@ -40,7 +40,8 @@ struct _mp_state_thread_t;
struct _mp_state_thread_t *mp_thread_get_state(void);
void mp_thread_set_state(void *state);
-void mp_thread_create(void *(*entry)(void*), void *arg, size_t *stack_size);
+void* mp_thread_create(void *(*entry)(void*), void *arg, size_t *stack_size);
+int mp_thread_is_alive(void*);
启用如下代码:
import _thread
import utime
def Entry():
utime.sleep_ms(1)
t = _thread.start_new_thread(Entry, ())
for i in range(10):
print('thread alive', _thread.is_alive(t))
打印几次 True,然后打印 False。
关于python - 检查线程是否已在 MicroPython 中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56348759/
我想为我为 micro:bit 编写的 micropython 代码编写测试。这里的示例使用 doctest。我愿意为任何测试系统解决问题。 名为 testing_python.py 的工作 pyth
我正在尝试将以下内容从 Javascript 转换为 micro:bit 的 MicroPython。这是来自发明者工具包的代码示例 3,从块转换为 Javascript。 let light_sta
我在 Micropython 1.9.3 .我知道如何使用 mpy-cross 将 .py 转换为可以由 Micropython 虚拟机执行的已编译 python .mpy。 问题是,如果我尝试使用
如前所述,here通过Micropython套接字接收消息会导致留下一个字节字符串以供使用。 我的问题是如何将此字节字符串转换为另一种可用格式? 我已经尝试过类似的方法: data = s.recv(
我有一个 microbit 项目,其中 microbit 垂直插入 kiktronics 机器人。 我想得到机器人的航向,但是 compass.heading() 只有微位是水平的才有效。我尝试使用
我在 bbc microbit 上运行 micropython。 我的 microbit 没有运行闪存中的程序,它正在显示0, 5, 0, SAD_FACE 那个动画是什么意思? 最佳答案 悲伤的脸表
我是电子产品新手,并且一直在使用 esp8266 和 Micropython。我正在尝试让几个链接的移位寄存器 (sn74hc595) 来控制 16 个 LED,但我很难理解我得到的结果。 我的脚本如
我需要使用 MAX31865 SPI 通信读取温度数据。首先,我尝试读取 4 字节数据: import machine import ubinascii spi = machine.SPI(1, ba
我可以在 esp8266 micropython 中使用 Sympy 库吗? 我尝试使用 ampy 安装它,但它返回错误 我想求解线性方程: 例如: from sympy import symbols
我只是在 LEGO EV3 单元上尝试一些 MicroPython 脚本,我正在努力寻找任何文档/示例来告诉我如何检查线程是否正在运行。 def newMethod(): print("new
哈喽大家好,我是咸鱼 当我们说 Python 时,通常指的是官方实现的 CPython 但还有很多比如 Pypy、Jython、MicroPython、Brython、RustPytho
我有一个运行MicroPython的NodeMCU ESP8266开发板。我在ESP8266上运行一个Web服务器。这是我基于这些板之一的第一个物联网项目。 下面是代码片段。 这是在main.py中执
我最近尝试在 ESP8266 板上加载 MicroPython,但失败了。为此,我必须安装 esptool。我成功安装了它,但是当我想使用它时,它不起作用。 例如, esptool.py --help
大多数 Micropython 端口都包含一个 ' micropython ' 模块,它有一个名为 ' const() 的特定函数'。我相信它的行为很像' #define ' 但是,在 C 中,它只接
我有一个奇怪的问题。当我在线解析正则表达式时,它工作正常,但在 MicroPython 中不匹配。 正则表达式: ()*(.*?)()*或(.*?)或(.*?) 匹配: <Storage {}&
我成功地将我的 ESP32 连接到 WebSocket 服务器。现在我正试图让它与 SSL 一起工作。我试过这个简单的代码来连接到 www.google.com。我用它来生成证书和 key 。 ope
我曾经读过关于最小化 python 安装,没有很多 python 默认安装附带的库,但在网上找不到它...... 我想做的是用执行它所需的 python 东西打包一个脚本并使其可移植。 有人知道这样的
如何配置 sphinx 以记录供 MicroPython 解释器使用的模块? 我面临的根本问题是 sphinx 从导入的模块中获取它记录的信息。因此,用于记录模块的 python 解释器必须可导入到那
我正在尝试使用 micropython 在 esp32 上设置安全套接字服务器。我使用/尝试了带有自签名证书的最新版本(esp32-idf3-20200117-v1.12-68-g3032ae115.
我正在尝试使用对 STM32F407VE 的以太网支持构建自定义 Micropython 固件。我在没有以太网支持的情况下 fork 了工作板,并尝试使用以太网支持对其进行修改。 我做过的事情: 定义
我是一名优秀的程序员,十分优秀!