🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
並列処理

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

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

263閲覧

サブスレッドに対してキー毎に変数を渡して処理を変化させたい。

P5_USER

総合スコア73

並列処理

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

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/11/11 10:16

いつもお世話になってます。

前提・実現したいこと

現状のコードでの動作は
1をキーインすると、サブスレッドが生成され、点滅するようになっています。
0をキーインすると、サブスレッドが終了します。

これを、
2をキーインすると、線形で黒へ変わるように(例えば2秒で黒へ)したいです。(機能を追加)

そのためには、
0. 0がキーインされていても、サブスレッドが消されないようにする
(常時サブスレッドを動かしておく)
0. キーインイベントでサブスレッドに(キーごとに)何らかの引数を渡す
が必要と考えています(合っているか自信がないです)。

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

先に挙げた2つのうち、1. については、

processing

1SubThread sub = null; 2void setup() { 3 // サブスレッドクラスを生成 4 sub = new SubThread(); 5 //Threadクラスを生成 6 Thread subThread = new Thread(sub); 7 //実行開始 8 subThread.start(); 9}

このように記述すれば良いと思っています。
2. についてが、どの様にすればよいのかわかりません。

processing

1while (running) { 2 try { 3 println("I am Sleeping..."); 4 // 点滅間隔|0.5[sec] 5 Thread.sleep(500); 6 } 7 catch( InterruptedException ex) { 8 ex.printStackTrace(); 9 } 10 11 if (toggle) { 12 G = 255; 13 println("Now G is 255"); 14 } else { 15 G = 0; 16 println("Now G is 0"); 17 } 18 toggle = !toggle; 19 }

この中に、キーインに応じて変数を渡して処理をさせればよいのかと考えていますが、
どの様に変更したらよいのかアイデアが出ません。

該当のソースコード

processing

1SubThread sub = null; 2 3float G = 255; 4 5void setup() { 6 frameRate(60); 7 size(500, 500, FX2D); 8 textSize(16); 9 textAlign(LEFT, TOP); 10} 11 12void draw() { 13 //background(200); 14 background(0, G, 0); 15 fill(0); 16 text("I am Main Thread.", 8, 0); 17 18 if ( sub != null && sub.running ) { 19 // サブスレッドが実行中 20 text("Sub Thread is Running.", 8, 20); 21 } else { 22 // サブスレッドは停止中 23 sub = null; 24 } 25} 26 27void keyPressed() { 28 if (key == '0') { 29 // サブスレッド実行中なら停止を依頼する 30 if ( sub != null && sub.running) { 31 sub.stopRunning(); 32 } 33 } else if (key == '1') { 34 // サブスレッド停止中なら生成する 35 if ( sub == null ) { 36 // サブスレッドクラスを生成 37 sub = new SubThread(); 38 //Threadクラスを生成 39 Thread subThread = new Thread(sub); 40 //実行開始 41 subThread.start(); 42 } 43 } 44} 45 46class SubThread implements Runnable { 47 // 実行許可FLG 48 private boolean running = true; 49 50 // ここが実行される 51 @Override 52 public void run() { 53 54 boolean toggle = true; 55 56 while (running) { 57 try { 58 println("I am Sleeping..."); 59 // 点滅間隔|0.5[sec] 60 Thread.sleep(500); 61 } 62 catch( InterruptedException ex) { 63 ex.printStackTrace(); 64 } 65 66 if (toggle) { 67 G = 255; 68 println("Now G is 255"); 69 } else { 70 G = 0; 71 println("Now G is 0"); 72 } 73 toggle = !toggle; 74 } 75 G = 255; 76 println("Sub Thread exit"); 77 } 78 79 public void gValue() { 80 } 81 public void stopRunning() { 82 running = false; 83 } 84} 85

試したこと

マルチスレッドについては
http://mslabo.sakura.ne.jp/WordPress/make/processing 逆引きリファレンス/マルチスレッドを実現するには/
を参考にしました。

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

processing3.4

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

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

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

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

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

guest

回答1

0

自己解決

要望に挙げた機能はゴリ押しで荒いですが、達成できました。

processing

1SubThread sub = null; 2 3float G = 255; 4 5// 今の状態 6int keyNum = 0; 7 8void setup() { 9 frameRate(60); 10 size(500, 500, FX2D); 11 textSize(16); 12 textAlign(LEFT, TOP); 13 14 // サブスレッドクラスを生成 15 sub = new SubThread(); 16 //Threadクラスを生成 17 Thread subThread = new Thread(sub); 18 //実行開始 19 subThread.start(); 20} 21 22void draw() { 23 background(0, G, 0); 24 fill(0); 25 text("I am Main Thread.", 8, 0); 26 27 if ( sub != null && sub.running ) { 28 // サブスレッドが実行中 29 text("Sub Thread is Running.", 8, 20); 30 } else { 31 // サブスレッドは停止中 32 sub = null; 33 } 34} 35 36void keyPressed() { 37 if (key == '0') { 38 keyNum = 0; 39 } else if (key == '1') { 40 keyNum = 1; 41 } else if (key == '2') { 42 keyNum = 2; 43 } 44} 45 46class SubThread implements Runnable { 47 // 実行許可FLG 48 private boolean running = true; 49 50 // ここが実行される 51 @Override 52 public void run() { 53 54 boolean toggle = true; 55 56 while (running) { 57 if (keyNum == 0) { 58 // 常時緑 59 G = 255; 60 println("Now keyNum is 0"); 61 } else if (keyNum == 1) { 62 try { 63 // 点滅間隔|0.5 [sec] 64 Thread.sleep(500); 65 } 66 catch (InterruptedException ex) { 67 ex.printStackTrace(); 68 } 69 70 if (toggle) { 71 G = 255; 72 println("Now G is 255"); 73 } else { 74 G = 0; 75 println("Now G is 0"); 76 } 77 toggle = !toggle; 78 } else if (keyNum == 2) { 79 // 常時黒 80 G = 0; 81 println("Now keyNum is 2"); 82 } 83 } 84 G = 255; 85 println("Sub Thread exit"); 86 } 87 88 public void stopRunning() { 89 running = false; 90 } 91} 92

とはいえ、別の問題が出てきたので新規で質問します。

投稿2019/11/11 10:45

P5_USER

総合スコア73

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

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

dodox86

2019/11/11 10:56

「ゴリ押し」と言うほどではないと思います。今のところ、keyNumは複数のスレッドで書き込むような競合は無いので、大きな問題はなく動作します。SubThread内の500ミリ秒のsleepの実行中に 1,2,3...と押すと、最新のみ取り出され、順序性は失われてしまいますが。(それが2.の要望につながるということかな?とも思いましたけれども)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問