鱼C论坛

 找回密码
 立即注册
查看: 1114|回复: 13

micro python 双线程

[复制链接]
发表于 2024-1-8 08:56:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
micro python 多线程,一个线程在ssd1306循环显示"hell,micro,python",一个线程在mqtt接收到"ting"后,ssd1306显示"OK"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-8 08:56:14 | 显示全部楼层
在MicroPython中,可以使用`_thread`模块来创建多线程。下面是一个实现你所描述的双线程代码示例:
import _thread
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C

# 初始化SSD1306显示器
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = SSD1306_I2C(128, 64, i2c)

# 全局变量用于线程间通信
message_received = False

# 线程1:循环显示"hello, micro, python"
def display_thread():
    global message_received
    while True:
        if message_received:
            oled.fill(0)
            oled.text("OK", 0, 0)
            oled.show()
            message_received = False
        else:
            oled.fill(0)
            oled.text("hello", 0, 0)
            oled.text("micro", 0, 16)
            oled.text("python", 0, 32)
            oled.show()

# 线程2:接收到"ting"后设置标志位,并发送"OK"
def receive_thread():
    global message_received
    while True:
        msg = input()
        if msg == "ting":
            message_received = True
            print("OK")

# 创建并启动线程
_thread.start_new_thread(display_thread, ())
_thread.start_new_thread(receive_thread, ())

请注意,这只是一个简单的示例,没有考虑线程同步和互斥的问题。在实际开发中,可能需要使用锁或信号量等机制来确保线程间的安全访问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-8 08:56:50 | 显示全部楼层
FishC 发表于 2024-1-8 08:56
在MicroPython中,可以使用`_thread`模块来创建多线程。下面是一个实现你所描述的双线程代码示例:

micro python 多线程,一个线程在ssd1306循环显示"hell,micro,python",一个线程在mqtt接收到"ting"后,ssd1306显示"OK"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-8 08:57:17 | 显示全部楼层
yc0526vip 发表于 2024-01-08 08:56
micro python 多线程,一个线程在ssd1306循环显示"hel ...


在MicroPython中,可以使用`_thread`模块来创建多线程。下面是一个实现你所描述的双线程代码示例:
import _thread
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from umqtt.simple import MQTTClient

# 初始化SSD1306显示器
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = SSD1306_I2C(128, 64, i2c)

# MQTT回调函数,当接收到消息时会自动调用
def on_message(topic, msg):
    if msg.decode() == "ting":
        oled.fill(0)
        oled.text("OK", 0, 0)
        oled.show()

# 线程1:循环显示"hello, micro, python"
def display_thread():
    while True:
        oled.fill(0)
        oled.text("hello", 0, 0)
        oled.text("micro", 0, 16)
        oled.text("python", 0, 32)
        oled.show()

# 线程2:连接MQTT服务器并监听消息
def mqtt_thread():
    client = MQTTClient("my_client_id", "mqtt_server_ip")
    client.set_callback(on_message)
    client.connect()
    client.subscribe("my_topic")
    
    while True:
        client.wait_msg()

# 创建并启动线程
_thread.start_new_thread(display_thread, ())
_thread.start_new_thread(mqtt_thread, ())

请注意,上述代码中需要替换`mqtt_server_ip`为真实的MQTT服务器IP地址,并根据需要修改其他参数。同时,你需要提前安装`umqtt.simple`模块来支持MQTT功能。

这个示例中,线程1负责循环显示“hello, micro, python”,线程2负责连接MQTT服务器,并在接收到消息时显示“OK”。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-8 09:29:53 | 显示全部楼层
FishC 发表于 2024-1-8 08:57
在MicroPython中,可以使用`_thread`模块来创建多线程。下面是一个实现你所描述的双线程代码示例:

...

循环显示"hello, micro, python" 未停止
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-8 09:30:08 | 显示全部楼层
yc0526vip 发表于 2024-01-08 09:29
循环显示"hello, micro, python" 未停止


如果你想要在收到mqtt消息并显示"OK"后停止循环显示"hello, micro, python",可以使用`_thread`模块的`exit()`方法来终止线程。下面是修改后的代码示例:import _threadfrom machine import Pin, I2Cfrom ssd1306 import SSD1306_I2Cfrom umqtt.simple import MQTTClient# 初始化SSD1306显示器i2c = I2C(scl=Pin(5), sda=Pin(4))oled = SSD1306_I2C(128, 64, i2c)# 全局变量用于线程间通信message_received = Falsedisplay_thread_running = True# MQTT回调函数,当接收到消息时会自动调用def on_message(topic, msg):    global message_received    if msg.decode() == "ting":        oled.fill(0)        oled.text("OK", 0, 0)        oled.show()        message_received = True# 线程1:循环显示"hello, micro, python"def display_thread():    while display_thread_running:        oled.fill(0)        oled.text("hello", 0, 0)        oled.text("micro", 0, 16)        oled.text("python", 0, 32)        oled.show()# 线程2:连接MQTT服务器并监听消息def mqtt_thread():    client = MQTTClient("my_client_id", "mqtt_server_ip")    client.set_callback(on_message)    client.connect()    client.subscribe("my_topic")    while not message_received:        client.check_msg()    # 收到mqtt消息后终止线程    global display_thread_running    display_thread_running = False    _thread.exit()# 创建并启动线程_thread.start_new_thread(display_thread, ())_thread.start_new_thread(mqtt_thread, ())请注意,上述代码中需要替换`mqtt_server_ip`为真实的MQTT服务器IP地址,并根据需要修改其他参数。同时,你需要提前安装`umqtt.simple`模块来支持MQTT功能。这个示例中,线程1负责循环显示"hello, micro, python",线程2负责连接MQTT服务器,并在接收到消息后显示"OK"并终止线程1的循环。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-8 09:32:25 | 显示全部楼层
FishC 发表于 2024-1-8 09:30
如果你想要在收到mqtt消息并显示"OK"后停止循环显示"hello, micro, python",可以使用`_thread`模块的` ...

排版错误,重新输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-8 09:32:53 | 显示全部楼层
yc0526vip 发表于 2024-01-08 09:32
排版错误,重新输出


非常抱歉,下面是修正后的代码,排版更加清晰:
import _thread
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from umqtt.simple import MQTTClient

# 初始化SSD1306显示器
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = SSD1306_I2C(128, 64, i2c)

# 全局变量用于线程间通信
message_received = False
display_thread_running = True

# MQTT回调函数,当接收到消息时会自动调用
def on_message(topic, msg):
    global message_received
    if msg.decode() == "ting":
        oled.fill(0)
        oled.text("OK", 0, 0)
        oled.show()
        message_received = True

# 线程1:循环显示"hello, micro, python"
def display_thread():
    while display_thread_running:
        oled.fill(0)
        oled.text("hello", 0, 0)
        oled.text("micro", 0, 16)
        oled.text("python", 0, 32)
        oled.show()

# 线程2:连接MQTT服务器并监听消息
def mqtt_thread():
    client = MQTTClient("my_client_id", "mqtt_server_ip")
    client.set_callback(on_message)
    client.connect()
    client.subscribe("my_topic")
    while not message_received:
        client.check_msg()
    
    # 收到mqtt消息后终止线程
    global display_thread_running
    display_thread_running = False
    _thread.exit()

# 创建并启动线程
_thread.start_new_thread(display_thread, ())
_thread.start_new_thread(mqtt_thread, ())

请注意,上述代码中需要替换`mqtt_server_ip`为真实的MQTT服务器IP地址,并根据需要修改其他参数。同时,你需要提前安装`umqtt.simple`模块来支持MQTT功能。

这个示例中,线程1负责循环显示"hello, micro, python",线程2负责连接MQTT服务器,并在接收到消息后显示"OK"并终止线程1的循环。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-8 09:35:30 | 显示全部楼层
FishC 发表于 2024-1-8 09:32
非常抱歉,下面是修正后的代码,排版更加清晰:

micro python,ssd1306循环显示mqtt消息,mqtt消息收到"ting"时,停止循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-8 09:35:44 | 显示全部楼层
yc0526vip 发表于 2024-01-08 09:35
micro python,ssd1306循环显示mqtt消息,mqtt消息收 ...


下面是一个可以实现你所描述的功能的MicroPython代码示例:
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from umqtt.simple import MQTTClient

# 初始化SSD1306显示器
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = SSD1306_I2C(128, 64, i2c)

# 全局变量用于线程间通信
message_received = False
display_thread_running = True

def on_message(topic, msg):
    global message_received
    if msg == b"ting":
        oled.fill(0)
        oled.text("OK", 0, 0)
        oled.show()
        message_received = True

def display_thread():
    while display_thread_running:
        oled.fill(0)
        oled.text("MQTT Message:", 0, 0)
        oled.text("Waiting...", 0, 16)
        oled.show()

def mqtt_thread():
    client = MQTTClient("my_client_id", "mqtt_server_ip")
    client.set_callback(on_message)
    client.connect()
    client.subscribe("my_topic")

    while not message_received:
        client.check_msg()

    client.disconnect()
    global display_thread_running
    display_thread_running = False

    # 清空屏幕
    oled.fill(0)
    oled.show()

# 创建并启动线程
_thread.start_new_thread(display_thread, ())
_thread.start_new_thread(mqtt_thread, ())

请注意,上述代码中需要将`mqtt_server_ip`替换为你真实的MQTT服务器IP地址。同时,你需要提前安装`umqtt.simple`模块以支持MQTT功能。

这个示例中,线程1负责循环显示"MQTT Message: Waiting..."的消息内容,线程2负责连接MQTT服务器并监听消息。当接收到"ting"消息时,线程2会停止线程1的循环并显示"OK"。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-8 09:39:36 | 显示全部楼层
FishC 发表于 2024-1-8 09:35
下面是一个可以实现你所描述的功能的MicroPython代码示例:

能否简化一些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-8 09:39:49 | 显示全部楼层


当然可以!下面是一个简化版的MicroPython代码示例:from machine import Pin, I2Cfrom ssd1306 import SSD1306_I2Cfrom umqtt.simple import MQTTClient# 初始化SSD1306显示器i2c = I2C(scl=Pin(5), sda=Pin(4))oled = SSD1306_I2C(128, 64, i2c)# 全局变量用于线程间通信message_received = Falsedisplay_thread_running = Truedef on_message(topic, msg):    global message_received    if msg == b"ting":        oled.fill(0)        oled.text("OK", 0, 0)        oled.show()        message_received = Truedef display_thread():    while display_thread_running:        oled.fill(0)        if message_received:            oled.text("OK", 0, 0)        else:            oled.text("MQTT Message:", 0, 0)            oled.text("Waiting...", 0, 16)        oled.show()def mqtt_thread():    client = MQTTClient("my_client_id", "mqtt_server_ip")    client.set_callback(on_message)    client.connect()    client.subscribe("my_topic")    while not message_received:        client.wait_msg()    client.disconnect()    global display_thread_running    display_thread_running = False    # 清空屏幕    oled.fill(0)    oled.show()# 创建并启动线程_thread.start_new_thread(display_thread, ())_thread.start_new_thread(mqtt_thread, ())请注意,上述代码中需要将`mqtt_server_ip`替换为你真实的MQTT服务器IP地址。同时,你需要提前安装`umqtt.simple`模块以支持MQTT功能。这个简化的示例中,线程1负责循环显示"MQTT Message: Waiting..."或"OK",线程2负责连接MQTT服务器并监听消息。当接收到"ting"消息时,线程2会停止线程1的循环并显示"OK"。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-8 09:44:37 | 显示全部楼层
FishC 发表于 2024-1-8 09:39
当然可以!下面是一个简化版的MicroPython代码示例:from machine import Pin, I2Cfrom ssd1306 import ...

排版错误,重新输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-8 09:45:07 | 显示全部楼层
yc0526vip 发表于 2024-01-08 09:44
排版错误,重新输出


非常抱歉,下面是重新排版的代码示例:
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from umqtt.simple import MQTTClient
import _thread

# 初始化SSD1306显示器
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = SSD1306_I2C(128, 64, i2c)

# 全局变量用于线程间通信
message_received = False
display_thread_running = True

def on_message(topic, msg):
    global message_received
    if msg == b"ting":
        oled.fill(0)
        oled.text("OK", 0, 0)
        oled.show()
        message_received = True

def display_thread():
    while display_thread_running:
        oled.fill(0)
        if message_received:
            oled.text("OK", 0, 0)
        else:
            oled.text("MQTT Message:", 0, 0)
            oled.text("Waiting...", 0, 16)
        oled.show()

def mqtt_thread():
    client = MQTTClient("my_client_id", "mqtt_server_ip")
    client.set_callback(on_message)
    client.connect()
    client.subscribe("my_topic")
    while not message_received:
        client.wait_msg()
    client.disconnect()
    global display_thread_running
    display_thread_running = False
    # 清空屏幕
    oled.fill(0)
    oled.show()

# 创建并启动线程
_thread.start_new_thread(display_thread, ())
_thread.start_new_thread(mqtt_thread, ())

请注意,上述代码中需要将`mqtt_server_ip`替换为你真实的MQTT服务器IP地址。同时,你需要提前安装`umqtt.simple`模块以支持MQTT功能。

这个简化的示例中,线程1负责循环显示"MQTT Message: Waiting..."或"OK",线程2负责连接MQTT服务器并监听消息。当接收到"ting"消息时,线程2会停止线程1的循环并显示"OK"。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表