質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
並列処理

複数の計算が同時に実行される手法

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2664閲覧

Sleep()を使用せずにディレイを設けたい。

pl4yer

総合スコア4

並列処理

複数の計算が同時に実行される手法

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2020/03/15 01:48

編集2020/03/15 02:04

前提・実現したいこと

プログラム初心者であまり分かっていないのですが質問します。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
raspberrypi 3B+を使用して、Python3環境で動かしています。

ある条件を満たしたときにdef()関数を呼び出します。
呼び出されてから3秒のdelayを設けた後に
LEDを点灯させます。
そのご0.5秒のdelayを設けた後にLEDを消灯します。

executerを使用しマルチコア(2コア)の処理を実装していますが、
LED点灯消灯のdef()関数が頻繁に呼び出され、
sleep()を使用すると、sleepの間他の処理が止まってしまうため、
sleep(3)だとすると、3秒間の間、def()で呼び出しても
何も反応してくれなくなってしまうのです。
ですのでsleep()は使用したくありません。
sleep以外でプログラムをfreezeさせることなくdelayを設けることができる
プログラムを教えていただけますか。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1def GPIO(): 2 sleep(3) 3 GPIO.output(6,GPIO.HIGH) 4 is_open_gpioR = True 5 print('GPIOon') 6 sleep(0.5) 7 GPIO.output(6,GPIO.LOW) 8 is_open_gpioR = False 9 print('GPIOoff')

試したこと

インターネットで調べ、Time()関数があることが分かり、
GPIO = GPIO.output(6,GPIO.HIGH)
Time(3,GPIO,arg = None, kwargs = None).start()
"""(Time(3,GPIO,output(6,GPIO.HIGH), arg = None, kwargs = None)”””
を試してみましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

恐縮なのですが、プログラム独学+超初心者ですので
専門用語等あまり理解できていないので分かりやすく教えていただけるとありがたいです。
よろしくお願いしたいます。

s.k👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/03/15 01:53

> 頻繁に呼び出されるため、sleep()は使用したくありません。 何故でしょう?sleep()を使えばいいのでは?
otn

2020/03/15 02:17

> sleep(3)だとすると、3秒間の間、def()で呼び出しても何も反応してくれなくなってしまうのです。 それはsleepの問題ではないです。 問題が発生しているコードを書いてください。
pl4yer

2020/03/15 02:32

そうなんですか?! sleep()中に同じdef()を呼び出しても同時に処理してくれるのですか? sleep()中は他の処理は止まるのだと思っていました。
thkana

2020/03/15 02:40

> 条件を満たしたときにdef()関数を呼び出します。 一度条件か満たされてから、0.3秒後,1秒後,1.5秒後から100msおきに10回,さらにLED点灯中、それぞれ条件が満たされる状況になるとして、LEDの点灯はどうなることを期待しますか。 また、呼び出す側では短い周期で定期的に関数を呼び出すことは出来ますか。
pl4yer

2020/03/15 02:59

>また、呼び出す側では短い周期で定期的に関数を呼び出すことは出来ますか。 はい、メインのループで画像処理を行い、良い判定、悪い判定を出すようにしております。 そのうち悪い判定が出た時に点灯するようにdef()を呼び出しています。 >一度条件か満たされてから、0.3秒後,1秒後,1.5秒後から100msおきに10回,さらにLED点灯中、それぞれ条件が満たされる状況になるとして、LEDの点灯はどうなることを期待しますか。 一度目呼び出すと、3秒後に点灯して0.5秒後に消える。 しかし、sleepで待っている3秒の間に2度目、3度目の呼出し命令が行くとします。 結果として0.5秒点灯するLEDが、各3秒が終わり、パッパッパと点灯して欲しいのです。 (現状は3秒の間に、次の命令が行っても何も反応してくれません。 一度目のLED点灯が終わってからは反応します。)
coco_bauer

2020/03/15 03:08

「executerを使用しマルチコア(2コア)の処理」をしているプログラムを質問に追加して下さい。 def()関数を定義しているところと、def()関数を呼び出しているところも追加してください。 質問に書かれているプログラムは、def()関数がどこにも出てこないので、参考になりません。
otn

2020/03/15 03:09

> sleep()中に同じdef()を呼び出しても同時に処理してくれるのですか? はい。ですので、単なるプログラムバグ、あるいは勘違いです。 > しかし、sleepで待っている3秒の間に2度目、3度目の呼出し命令が行くとします。 > 結果として0.5秒点灯するLEDが、各3秒が終わり、パッパッパと点灯して欲しいのです。 時刻ごとにどうなってほしいか、具体的に書いてください。 0:00:00と0:00:01と、2回呼び出した場合は?
pl4yer

2020/03/15 05:05

>時刻ごとにどうなってほしいか、具体的に書いてください。 0:00:00と0:00:01と、2回呼び出した場合は? 難しいですが、、、例えば、、、 0:00:00 一回目呼び出し 0:00:01 二回目呼び出し 0:00:02 三回目呼び出し 0:00:03 一回目LED点灯 0:00:03.5 一回目LED消灯 0:00:04 二回目LED点灯 0:00:04.5 二回目LED消灯 0:00:05 三回目LED点灯 0:00:05.5 三回目LED消灯 : : : てな感じです!
otn

2020/03/15 06:36

実際にはどうなるのですか?
thkana

2020/03/15 07:30

> 100msおきに10回 に対してはどう反応するのでしょう。とりあえず5回でもいいですけど、 0:00:00.000 1回目条件成立 0:00:00:100 2回め条件成立 0:00:00:200 3回め条件成立 0:00:00:300 4回め条件成立 0:00:00:400 5回め条件成立 0:00:03.000 LED点灯(1回目成立による) 0:00:03.100 既にLED点灯している 0:00:03.200 既にLED点灯している 0:00:03.300 既にLED点灯している 0:00:03.400 既にLED点灯している 0:00:03.500 LED消灯?(1回目成立による) それとも LED点灯?(5回目成立による) 0:00:03.600 LED消灯?(2回目成立による) それとも点灯継続?(3~5回目成立による) (以下略) それと、画像処理とのことですが、「0.5秒」というのはどれくらいの精度を要求されますか? 画像処理の場合、フレーム(30fpsなら33ms, 60fpsなら16.6msとか)に同期して処理できるととても話が簡単になったりするのですが。そうすると「0.5秒」は正確には作れないので。(まぁ、Linux使っている時点で時間精度に対する要求は無茶なんですが)
pl4yer

2020/03/15 08:00

>thkana 条件を満たしたとき。というのはdef()を呼び出すための条件を満たしたとき。です。 画像処理中に×判定を出した気に、def()を呼び出すプログラムを書いています。 >0:00:00.000 1回目条件成立 0:00:00:100 2回め条件成立 0:00:00:200 3回め条件成立 こんなに頻繁に呼び出すことはありません。早くても1秒くらいの間隔は空きます! ですので、、、 0:00:00.000 1回目条件成立により呼出し 0:00:01:000 2回め条件成立により呼出し 0:00:02:000 3回め条件成立により呼出し 0:00:03:000 4回め条件成立により呼出し+1回目のLED点灯 0:00:03:500 1回目のLED消灯 0:00:04.000 2回目のLED点灯 0:00:04.500 2回目のLED消灯 0:00:05.000 3回目のLED点灯 0:00:05.500 3回目のLED消灯 となります。5回でも10回でも同じようなことが続きます。 点灯時間がかなり短いのであまり重なることはありません。 重なった場合は、、、例えば、、 0:00:03.000 n回目のLED点灯(0.5秒後消える) 0:00:03:100 点灯 0:00:03:200 点灯 0:00:03:300 点灯 0:00:03:400 点灯 n+1回目のLED点灯命令が下るとする。(0.5秒後に消える。) 0:00:03:500 点灯 ここでn回目のLEDが点灯命令は消えるが↑が追加されているのでまだ点灯。 0:00:03:600 点灯 0:00:03:700 点灯 0:00:03:800 点灯 0:00:03:900 消灯 n+1回目のLED点灯が終わる時。 となるのですが、、、 分かりにくくてすみません。 0:00:00:200 3回め条件成立
otn

2020/03/15 10:17

実際にはどうなるのですか? ていうか、コードを載せない理由は何でしょうか?
pl4yer

2020/03/16 00:29 編集

エラーが出ないので困っています。 思い通りに動かないので中でどのように動いているかよくわからないのです。 なのでどこのコードがエラーなのか、、、 ですがこのdef()の中プログラムが問題であるのでこの部分以外に載せる部分はないかなと。 実際は 0:00:00.000 1回目条件成立により呼出し 0:00:01.000 (2回目呼び出ししているはず!) 0:00:02.000 (3回目呼び出ししているはず!) 0:00:03.000 1回目のLED点灯 0:00:03.500 1回目のLED消灯 0:00:04.000 2回目のLED光らず (4回目の呼出しがここであるとすると、、、↓) 0:00:05.000 3回目のLED光らず ・・・ 0:00:07.000 4回目のLED点灯 0:00:07.000 4回目のLED消灯 となってしまうのです。 一回目のプログラムが動いてる間は二回目、三回目の呼出しがあっても無視してしまっているのです。 一回目のプログラムが終わると次の呼出しに反応するようになります。
otn

2020/03/16 00:33

> このdef()の中プログラムが問題であるので 呼び出し方が悪いです。
pl4yer

2020/03/16 01:10

if target['X'] > DETECT_WIDTH / 2: executorGPIO.submit(GPIO) def GPIO():はこのように呼び出しております! P.S ふと疑問に思ったのですが、 同じdef()「このプログラムで言えばdef GPIO():」は 同時に、いくつも、呼び出すことは可能ですか? 同時にに10回実行しなさい。などです。
guest

回答2

0

遅延後の時刻を取得して、その時刻が過ぎたかどうか、で判断して次の処理に進めばいいです

たとえば、メインループ中に、時刻が過ぎたかの判断を入れれば処理を止めないで済みます

#まあ、時刻を、というよりTickCount値を取得してどーコーになると思いますが

投稿2020/03/15 02:20

編集2020/03/15 02:21
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pl4yer

2020/03/15 07:45

できればインターネット回線がなくとも動くプログラムが組みたいです! ですので時刻を取得するやり方はできれば避けたいのです。
y_waiwai

2020/03/15 07:53

時刻といっても、リアルな時刻の必要はありません。 また、時分秒である必要もありません https://pg-chain.com/python-time-perf_counter 時間差を計測する記事ですが、これで時刻の計測もできます
guest

0

自己解決

時間取得(今回の場合は time.perf_counter() を使用)の
差分によってディレイを作り出すことができた。

"""
start = time.perf_counter()
while True :
end = time.perf_counter()
if (end - start) > 1.5 :
break
else :
continue
"""

時間を高速で取得し続けるため、無駄にCPUを使用してしまったり、
1.5sと設定しているがそれほど正確ではない、
などいろいろ問題はあるが、ある程度はこれで動いてくれた。

解答してくださった方ありがとうございました。

投稿2020/04/28 02:28

pl4yer

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問