从零玩转CanMV-K230(8)-多线程例程


前言

K230上不支持threading,只能支持_thread,该模块实现了相应 CPython 模块的子集,CPython 是 Python 编程的参考实现 语言,也是最著名的一种。然而,它是众多 实现(包括 Jython、IronPython、PyPy 和 MicroPython)。 虽然 MicroPython 的实现与 CPython 有很大不同, 它旨在保持尽可能多的兼容性


一、_thread模块API

_thread.LockType
这是 lock 对象的类型。

_thread.start_new_thread(函数, args[, kwargs])
启动新线程并返回其标识符。线程使用参数 list args(必须是 Tuples)执行函数函数。可选的 kwargs 参数指定关键字参数的字典。当函数 返回,则线程会静默退出。当函数以 unhandled 异常,则会打印堆栈跟踪,然后线程退出(但 其他线程继续运行)。

_thread.interrupt_main()
在主线程中引发异常。子线程可以 使用此功能可中断主线程。

_thread.exit()
引发异常。如果未捕获,这将导致 thread 以静默方式退出。

_thread.allocate_lock()
返回新的 lock 对象。锁的方法如下所述。该锁是 最初解锁。

_thread.get_ident()
返回当前线程的 'thread identifier'。这是一个非零 整数。它的值没有直接的意义;它旨在作为一个神奇的 cookie 来 例如,用于索引特定于线程的数据的字典。线程标识符 当一个线程退出并创建另一个线程时,可能会被回收。

_thread.stack_size([大小])
返回创建新线程时使用的线程堆栈大小。可选的 size 参数指定要用于后续创建的堆栈大小 threads 的 URL 中,并且必须为 0(使用 platform 或 configured default)或正数 整数值至少为 32,768 (32 KiB)。如果未指定 size, 使用 0。如果更改线程堆栈大小是 unsupported,则引发 a。如果指定的堆栈大小为 invalid,则引发 a 且堆栈大小未修改。32 KiB 是当前支持的最小堆栈大小值,以保证足够 stack 空间。请注意,某些平台可能具有 对堆栈大小值的特定限制,例如要求 最小堆栈大小> 32 KiB 或需要按系统的倍数分配 内存页面大小 - 应参阅平台文档了解更多信息 信息(4 KiB 页很常见;使用 4096 的倍数作为堆栈大小为 在没有更具体信息的情况下建议的方法)。 可用性: Windows,具有 POSIX 线程的系统。

_thread.TIMEOUT_MAX
timeout 参数允许的最大值。指定大于此值的超时将 引发 .Lock.acquire()

lock.acquire(waitFlag=1,超时=-1)
如果没有任何可选参数,此方法将无条件获取锁,如果 需要等待,直到它被另一个线程释放(只有一个线程在 时间可以获得一把锁——这就是它们存在的原因)。

如果存在整数 waitflag 参数,则操作取决于其 value:如果为零,则只有在可以获取锁的情况下才会获取锁 立即不等待,如果为非零,则获取锁 无条件地如上所述。

如果存在浮点超时参数且为正数,则 指定返回前的最长等待时间(以秒为单位)。负 timeout 参数指定无界等待。不能指定 如果 WaitFlag 为零,则为 Timeout。

返回值是是否成功获取锁,如果未成功获取。TrueFalse

lock.release()
释放锁。该锁必须是较早获得的,但不是 必须通过同一条线索。

lock.locked()
返回锁的状态:如果它已被某个线程获取,如果没有。TrueFalse

二、使用示例

创建并启动线程

创建2个线程,分别进行打印

import _thread
import time


def task_1():
    while True:
        print("task 1")
        time.sleep(1)

def task_2():
    while True:
        print("task 2")
        time.sleep(1)


#创建闪灯task和串口task
_thread.start_new_thread(task_1, ())
_thread.start_new_thread(task_2, ())


while True:
    time.sleep(0.01) #防止CPU满跑

在这里插入图片描述

停止线程

在python的介绍中,_thread并没有制定摧毁某个task的接口,只有在task调用的函数退出运行,也就是要退出task中的while,所以,我们可以使用一个flag,来决定while是否可以运行。

import _thread
import time

task_run_flag = True

def task_1():
    global task_run_flag
    while task_run_flag:
        print("task 1")
        time.sleep(1)

def task_2():
    global task_run_flag
    count=0
    while True:
        count=count+1
        print("task 2")
        if count >10:
           task_run_flag=False
        time.sleep(1)


#创建闪灯task和串口task
_thread.start_new_thread(task_1, ())
_thread.start_new_thread(task_2, ())


while True:
    time.sleep(0.01) #防止CPU满跑

在这里插入图片描述

_thread.exit()

调用_thread.exit()后,线程退出

import _thread
import time

task_run_flag = True

def task_1():
    global task_run_flag
    while task_run_flag:
        print("task 1")
        time.sleep(1)

def task_2():
    global task_run_flag
    count=0
    while True:
        count=count+1
        print("task 2")
        if count >10:
           task_run_flag=False
           _thread.exit()
        time.sleep(1)


#创建闪灯task和串口task
_thread.start_new_thread(task_1, ())
_thread.start_new_thread(task_2, ())


while True:
    time.sleep(0.01) #防止CPU满跑


总结

本章节介绍了K230多线程的示例,大家可以根据项目实际需要参考API使用

### 关于 CANMV-K230 设备播放视频的方法 对于 CANMV-K230 来说,要实现视频播放功能涉及多个方面的工作,包括但不限于硬件初始化、解码库的选择以及具体的编程接口调用。 #### 硬件准备与环境设置 为了能够顺利地在 CANMV-K230 上运行视频播放程序,首先需要确保已经正确安装并设置了开发环境。这通常意味着完成了 MicroPython 镜像的烧录工作,并且验证了基本的 I/O 功能正常运作[^2]。 #### 软件框架选择 针对视频处理任务,推荐采用 Kendryte 提供的标准 SDK 进行开发。特别是当涉及到多媒体应用时,SDK 中包含了必要的驱动和支持函数来简化开发者的工作流程。通过配置 `smart-env.sh` 文件中的编译器路径和其他工具链参数,可以为后续的应用构建打下良好基础[^3]。 #### 实现视频播放的具体步骤 虽然官方文档并没有直接提供完整的视频播放实例代码,但是可以根据已有的资源推断出大致的操作流程: 1. **加载媒体文件**:将待播放的视频文件传输到板载存储介质上; 2. **初始化显示模块**:根据所选用的显示屏型号完成相应的初始化过程; 3. **集成第三方解码库**:考虑到 K230 的性能特点,可能需要引入外部优化过的音视频解码组件(如 FFmpeg 或者其他轻量级替代品),以便高效解析常见的流格式; 4. **编写控制逻辑**:利用 Python 或 C/C++ 编写应用程序脚本来管理整个回放周期内的各项活动,比如读取帧数据、同步音频轨道等。 5. **调试与测试**:最后一步是对整体解决方案进行全面的功能性和稳定性检验,及时修正发现的问题直至达到预期效果为止。 ```python import os from machine import Pin, SPI import lcd # 假设存在这样的LCD库用于屏幕输出 def play_video(file_path): """模拟视频播放""" try: with open(file_path,'rb') as f: while True: frame_data = f.read(1024*64) # 模拟读取一桢的数据 if not frame_data: break process_frame(frame_data) print('Video playback completed.') except Exception as e: print(f'Error during video playback: {e}') def process_frame(data): """处理每一帧图像数据""" pass # 此处应加入实际的画面渲染指令 if __name__ == '__main__': spi = SPI(-1, baudrate=27000000, polarity=0, phase=0) display = lcd.LCD(spi, dc=Pin(9), cs=Pin(8)) file_name = '/path/to/video/file.mp4' play_video(file_name) ``` 上述伪代码仅作为概念性的指导而非可以直接执行的真实范例。具体实施细节会依赖于目标平台特性及个人需求而有所不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值