

sipeedのmaixduinoというHWでmicropythonを動作させているのですが、低水準の_thread
APIをサポートしており、スレッド間のデータ通信を行いたいのですがどのようにすれば良いのでしょうか？

[code]

    abc=0
    
    def testThread():
        cnt=0
        while True:
            time.sleep_ms(100)
            lcd.draw_string(0,20,"cnt1:"+str(cnt))
            cnt+=1
            abc+=1
    
[/code]

上記の様にglobalで宣言した変数は参照できないようでした。


CC BY-SA 4.0
2020-04-28T21:46:15.117
66088
2020-04-29T07:10:46.747
2020-04-29T07:10:46.747
3060
37258
question
python
micropythonの低水準API _thread でのスレッド間通信について


このくらいのソースであれば、`micro`とか`thread`とかは関係無く変数のスコープの問題では？  
この記事のように。  
[Using a global variable with a
thread](https://stackoverflow.com/q/19790570/9014308)

参照するだけなら不要ですが、更新して他にも影響させるなら、関数の最初に`global`変数を使用する宣言が必要でしょう。

[code]

    abc=0
    
    def testThread():
        global abc # global変数宣言
        cnt=0
        while True:
            time.sleep_ms(100)
            lcd.draw_string(0,20,"cnt1:"+str(cnt))
            cnt+=1
            abc+=1
    
[/code]

そして同一ファイル内であれば上記で良いでしょうが、ちゃんと工夫が必要な場面もあるでしょう、というのが以下の記事だと思われます。  
[Global Variables](https://forum.micropython.org/viewtopic.php?t=5686)

> How to declare global variables in micropython that can be accessible from
> boot.py, main.py and many files.  
>  creating and writing and updating file data taking time and getting into
> error.I want to declare only 2 variables.  
>  Also want to create and freeze(compile) code for python server that listen
> on port for request.
>
> boot.py、main.py、および多くのファイルからアクセスできるmicropythonでグローバル変数を宣言する方法。  
>  ファイルデータの作成、書き込み、更新に時間がかかり、エラーが発生します。2つの変数のみを宣言します。  
>  また、リクエストをポートでリッスンするPythonサーバーのコードを作成してフリーズ（コンパイル）したいとします。

* * *

> Depending on your variable you can do as @stijn suggested in [this
> post](https://forum.micropython.org/viewtopic.php?f=16&t=6997&p=39749#p39747).
>
> 変数に応じて、この投稿で提案されている@stijnのように実行できます。

* * *

> If you create a variable in boot.py it will be available to main.py and to
> the REPL. But it won't be available to modules you import because of the way
> Python namespaces work: you would need explicitly to pass it to
> functions/methods in the module.
>
> boot.pyで変数を作成すると、main.pyとREPLで使用できるようになります。
> ただし、Python名前空間が機能する方法のため、インポートするモジュールでは使用できません。モジュール内の関数/メソッドに明示的に渡す必要があります。

* * *

[stijn - Re: Is there an easy way to expose the value of a #define from
mpconfigport.h to Python
code?](https://forum.micropython.org/viewtopic.php?f=16&t=6997&p=39749#p39747)

> Something like this in main.c, after initialization and before the REPL or
> file execution:
>
> 何かmain.cのような、初期化の後、REPLまたはファイル実行の前に：
[code]

>     mp_store_global(QSTR_FROM_STR_STATIC("dupterm_value"),
> mp_obj_new_int(MICROPY_PY_OS_DUPTERM));
>  
[/code]

>
> then when you enter the REPL or in a file, dupterm_value is in the global
> scope so you can acces it e.g.
>
> 次に、REPLまたはファイルに入力すると、dupterm_valueがグローバルスコープにあるため、それにアクセスできます。


CC BY-SA 4.0
2020-04-28T23:03:51.787
66089
2020-04-28T23:24:33.253
2020-04-28T23:24:33.253
26370
26370
66088
answer