いつもお世話になっています。
前提・実現したいこと
下記の②のコードがあります(ベース)。
この中には、
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/03 01:47