鱼C论坛

 找回密码
 立即注册
查看: 503|回复: 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`模块来创建多线程。下面是一个实现你所描述的双线程代码示例:

  1. import _thread
  2. from machine import Pin, I2C
  3. from ssd1306 import SSD1306_I2C

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

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

  9. # 线程1:循环显示"hello, micro, python"
  10. def display_thread():
  11.     global message_received
  12.     while True:
  13.         if message_received:
  14.             oled.fill(0)
  15.             oled.text("OK", 0, 0)
  16.             oled.show()
  17.             message_received = False
  18.         else:
  19.             oled.fill(0)
  20.             oled.text("hello", 0, 0)
  21.             oled.text("micro", 0, 16)
  22.             oled.text("python", 0, 32)
  23.             oled.show()

  24. # 线程2:接收到"ting"后设置标志位,并发送"OK"
  25. def receive_thread():
  26.     global message_received
  27.     while True:
  28.         msg = input()
  29.         if msg == "ting":
  30.             message_received = True
  31.             print("OK")

  32. # 创建并启动线程
  33. _thread.start_new_thread(display_thread, ())
  34. _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`模块来创建多线程。下面是一个实现你所描述的双线程代码示例:

  1. import _thread
  2. from machine import Pin, I2C
  3. from ssd1306 import SSD1306_I2C
  4. from umqtt.simple import MQTTClient

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

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

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

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

  31. # 创建并启动线程
  32. _thread.start_new_thread(display_thread, ())
  33. _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
排版错误,重新输出


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

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

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

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

  19. # 线程1:循环显示"hello, micro, python"
  20. def display_thread():
  21.     while display_thread_running:
  22.         oled.fill(0)
  23.         oled.text("hello", 0, 0)
  24.         oled.text("micro", 0, 16)
  25.         oled.text("python", 0, 32)
  26.         oled.show()

  27. # 线程2:连接MQTT服务器并监听消息
  28. def mqtt_thread():
  29.     client = MQTTClient("my_client_id", "mqtt_server_ip")
  30.     client.set_callback(on_message)
  31.     client.connect()
  32.     client.subscribe("my_topic")
  33.     while not message_received:
  34.         client.check_msg()
  35.    
  36.     # 收到mqtt消息后终止线程
  37.     global display_thread_running
  38.     display_thread_running = False
  39.     _thread.exit()

  40. # 创建并启动线程
  41. _thread.start_new_thread(display_thread, ())
  42. _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代码示例:

  1. from machine import Pin, I2C
  2. from ssd1306 import SSD1306_I2C
  3. from umqtt.simple import MQTTClient

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

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

  10. def on_message(topic, msg):
  11.     global message_received
  12.     if msg == b"ting":
  13.         oled.fill(0)
  14.         oled.text("OK", 0, 0)
  15.         oled.show()
  16.         message_received = True

  17. def display_thread():
  18.     while display_thread_running:
  19.         oled.fill(0)
  20.         oled.text("MQTT Message:", 0, 0)
  21.         oled.text("Waiting...", 0, 16)
  22.         oled.show()

  23. def mqtt_thread():
  24.     client = MQTTClient("my_client_id", "mqtt_server_ip")
  25.     client.set_callback(on_message)
  26.     client.connect()
  27.     client.subscribe("my_topic")

  28.     while not message_received:
  29.         client.check_msg()

  30.     client.disconnect()
  31.     global display_thread_running
  32.     display_thread_running = False

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

  36. # 创建并启动线程
  37. _thread.start_new_thread(display_thread, ())
  38. _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
排版错误,重新输出


非常抱歉,下面是重新排版的代码示例:

  1. from machine import Pin, I2C
  2. from ssd1306 import SSD1306_I2C
  3. from umqtt.simple import MQTTClient
  4. import _thread

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

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

  11. def on_message(topic, msg):
  12.     global message_received
  13.     if msg == b"ting":
  14.         oled.fill(0)
  15.         oled.text("OK", 0, 0)
  16.         oled.show()
  17.         message_received = True

  18. def display_thread():
  19.     while display_thread_running:
  20.         oled.fill(0)
  21.         if message_received:
  22.             oled.text("OK", 0, 0)
  23.         else:
  24.             oled.text("MQTT Message:", 0, 0)
  25.             oled.text("Waiting...", 0, 16)
  26.         oled.show()

  27. def mqtt_thread():
  28.     client = MQTTClient("my_client_id", "mqtt_server_ip")
  29.     client.set_callback(on_message)
  30.     client.connect()
  31.     client.subscribe("my_topic")
  32.     while not message_received:
  33.         client.wait_msg()
  34.     client.disconnect()
  35.     global display_thread_running
  36.     display_thread_running = False
  37.     # 清空屏幕
  38.     oled.fill(0)
  39.     oled.show()

  40. # 创建并启动线程
  41. _thread.start_new_thread(display_thread, ())
  42. _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-5-20 18:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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