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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

並列処理

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

Processing

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

Q&A

解決済

1回答

701閲覧

サブスレッドの書き方を変えると、キーボードでの状態遷移が出来なくなった

P5_USER

総合スコア73

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

並列処理

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

Processing

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

0グッド

0クリップ

投稿2019/12/02 09:55

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

前提・実現したいこと

下記の②のコードがあります(ベース)。
この中には、
keyNum, keyNumBefore, Gがあり、キーが押された状態の遷移について、
Gを変更することで、点滅やフェードインなど描写を変更できます。

今は、変更対象がGだけ(1つ)ですが、今後1つの画面内でコントロールする描写を4つ増やしていきます。
つまり、keyNum・keyNumBefore・Gに相当する変数が総計15個になります。

現状、②ではメインスレッドがサブスレッドに対して
「この変数を使って処理をしてください」
というようなものにはなっていません。
サブスレッドのコード内でkeyNum・keyNumBefore・Gを使うようにしています。

サブスレッドが5個必要になる上で、各スレッドに変数を紐付けさせて
実行させねばなりません。

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

こちらの回答をまねてみたのですが、
①のコードでキーを押しても描写の変化がありませんでした。
(キーの長押しでコンソールには時折"1 pressed"と出ます。)

①のような書き方で②のような動作を実現させるには、
①のどこが悪影響を及ぼしているのか分かりません。

該当のソースコード

①正しくないけど、複数の同一機能サブスレッドの為には望ましい方
※正しく動作(キーインにて描写変更)していない

processing

1Runnable r = null; 2 3int keyNum = 0;// 今の状態 4int keyNumBefore = 0; 5float G = 255; 6 7void setup() { 8 frameRate(60); 9 size(500, 500, FX2D); 10 textSize(16); 11 textAlign(LEFT, TOP); 12 13 r = new SubThread(keyNum, keyNumBefore, G); 14 new Thread(r).start(); 15} 16 17void draw() { 18 background(0, G, 0); 19 fill(0); 20 text("I am Main Thread.", 8, 0); 21 text("Sub Thread is Running.", 8, 20); 22} 23 24void keyPressed() { 25 if (key == '0') { 26 keyNum = 0; 27 println("0 pressed"); 28 } else if (key == '1') { 29 keyNum = 1; 30 println("1 pressed"); 31 } else if (key == '2') { 32 keyNum = 2; 33 println("2 pressed"); 34 } 35} 36 37class SubThread implements Runnable { 38 private boolean running = true;// 実行許可FLG 39 private boolean toggle = true; 40 41 private int now; 42 private int before; 43 private float gValue; 44 45 public SubThread(int _now, int _before, float _gValue) { 46 this.now = _now; 47 this.before = _before; 48 this.gValue = _gValue; 49 } 50 51 // ここが実行される 52 @Override 53 public void run() { 54 55 while (running) { 56 switch(now) { 57 case 0: 58 case0(); 59 break; 60 61 case 1: 62 case1(); 63 break; 64 65 case 2: 66 case2(); 67 break; 68 } 69 70 // 値を更新 71 before = now; 72 73 switch (now) { 74 case 0: 75 trySleep(0.01); 76 break; 77 78 case 1: 79 trySleep(0.5); 80 break; 81 82 case 2: 83 trySleep(0.01); 84 break; 85 } 86 } 87 println("Sub Thread exit"); 88 } 89 90 void case0() { 91 if (before == 0) { 92 if (gValue + 4 < 255) { 93 gValue = gValue + 4; 94 println(gValue); 95 } else { 96 gValue = 255; 97 } 98 } else if (before == 1) { 99 gValue = 255; 100 } else if (before == 2) { 101 gValue = 0; 102 } 103 println("state|0"); 104 } 105 106 void case1() { 107 if (toggle) { 108 gValue = 0; 109 } else { 110 gValue = 255; 111 } 112 // フラグ反転 113 toggle = !toggle; 114 println(before); 115 println("state|1"); 116 } 117 118 void case2() { 119 if (before == 2) { 120 if (gValue - 4 > 0) { 121 gValue = gValue - 4; 122 println(gValue); 123 } else { 124 gValue = 0; 125 } 126 } else if (before == 1) { 127 gValue = 255; 128 } 129 println("state|2"); 130 } 131 132 void trySleep(float time) { 133 try { 134 Thread.sleep((long)(time * 1000)); 135 } 136 catch (InterruptedException ex) { 137 ex.printStackTrace(); 138 } 139 } 140} 141

②正しい動作の方

processing

1SubThread sub = null; 2 3int keyNum = 0;// 今の状態 4int keyNumBefore = 0; 5float G = 255; 6 7void setup() { 8 frameRate(60); 9 size(500, 500, FX2D); 10 textSize(16); 11 textAlign(LEFT, TOP); 12 13 // サブスレッドクラスを生成 14 sub = new SubThread(); 15 16 //Threadクラスを生成 17 Thread subThread = new Thread(sub); 18 19 //実行開始 20 subThread.start(); 21} 22 23void draw() { 24 background(0, G, 0); 25 fill(0); 26 text("I am Main Thread.", 8, 0); 27 text("Sub Thread is Running.", 8, 20); 28} 29 30void keyPressed() { 31 if (key == '0') { 32 keyNum = 0; 33 println("0 pressed"); 34 } else if (key == '1') { 35 keyNum = 1; 36 println("1 pressed"); 37 } else if (key == '2') { 38 keyNum = 2; 39 println("2 pressed"); 40 } 41} 42 43class SubThread implements Runnable { 44 private boolean running = true;// 実行許可FLG 45 private boolean toggle = true; 46 47 // ここが実行される 48 @Override 49 public void run() { 50 51 while (running) { 52 switch(keyNum) { 53 case 0: 54 case0(); 55 break; 56 57 case 1: 58 case1(); 59 break; 60 61 case 2: 62 case2(); 63 break; 64 } 65 66 // 値を更新 67 keyNumBefore = keyNum; 68 69 switch (keyNum) { 70 case 0: 71 trySleep(0.01); 72 break; 73 74 case 1: 75 trySleep(0.5); 76 break; 77 78 case 2: 79 trySleep(0.01); 80 break; 81 } 82 } 83 println("Sub Thread exit"); 84 } 85 86 void case0() { 87 if (keyNumBefore == 0) { 88 if (G + 4 < 255) { 89 G = G + 4; 90 println(G); 91 } else { 92 G = 255; 93 } 94 } else if (keyNumBefore == 1) { 95 G = 255; 96 } else if (keyNumBefore == 2) { 97 G = 0; 98 } 99 println("state|0"); 100 } 101 102 void case1() { 103 if (toggle) { 104 G = 0; 105 } else { 106 G = 255; 107 } 108 // フラグ反転 109 toggle = !toggle; 110 println(keyNumBefore); 111 println("state|1"); 112 } 113 114 void case2() { 115 if (keyNumBefore == 2) { 116 if (G - 4 > 0) { 117 G = G - 4; 118 println(G); 119 } else { 120 G = 0; 121 } 122 } else if (keyNumBefore == 1) { 123 G = 255; 124 } 125 println("state|2"); 126 } 127 128 void trySleep(float time) { 129 try { 130 Thread.sleep((long)(time * 1000)); 131 } 132 catch (InterruptedException ex) { 133 ex.printStackTrace(); 134 } 135 } 136} 137

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

processing 3.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

なんだかスレッドを使って話を難しくしているような気がずっとしているのだけれど。

そんな難しいことより

Processing

1class Test { 2 int val; 3 Test( int n ) { 4 val=n; 5 } 6 void show() { 7 println(val); 8 } 9} 10Test test; 11int n=100; 12void setup() { 13 test=new Test(n); 14} 15void draw() { 16 n+=10; 17 test.show(); 18}

としたとき、表示されるのはずっと100のままだ、というのは理解していますか?

投稿2019/12/02 15:45

thkana

総合スコア7639

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

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

P5_USER

2019/12/03 01:47

thkanaさん 回答ありがとうございます。 いえ、今指摘されて初めて、そうなんだ。と知りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問