yc0526vip 发表于 2024-1-8 08:56:00

micro python 双线程

micro python 多线程,一个线程在ssd1306循环显示"hell,micro,python",一个线程在mqtt接收到"ting"后,ssd1306显示"OK"

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2024-1-8 08:56:50

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




micro python 多线程,一个线程在ssd1306循环显示"hell,micro,python",一个线程在mqtt接收到"ting"后,ssd1306显示"OK"

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2024-1-8 09:29:53

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

...

循环显示"hello, micro, python" 未停止

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2024-1-8 09:32:25

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

排版错误,重新输出

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2024-1-8 09:35:30

FishC 发表于 2024-1-8 09:32
非常抱歉,下面是修正后的代码,排版更加清晰:




micro python,ssd1306循环显示mqtt消息,mqtt消息收到"ting"时,停止循环

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2024-1-8 09:39:36

FishC 发表于 2024-1-8 09:35
下面是一个可以实现你所描述的功能的MicroPython代码示例:




能否简化一些

FishC 发表于 2024-1-8 09:39:49

yc0526vip 发表于 2024-01-08 09:39
能否简化一些

当然可以!下面是一个简化版的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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2024-1-8 09:44:37

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

排版错误,重新输出

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: micro python 双线程