2014年2月18日火曜日

久しぶりにAndroidプログラミングserial monitor(6) threadの親子関係

その5はこちら

Android programmingの書籍をamazonで注文しましたが、雪のために配送が遅延しているようで、なかなか届きません.

とあるsample programを真似してserial monitorの自作アプリを作ったけれどなぜか動かなくて、sample programがFT232RLと通信しているスレッド処理部のjava codeを読んでいるのですが、スレッドについていまいちよく判らんし、ネットにも紋切り型の解説しか無くて困った困ったというのが今のわたしの状況です.
わからないことは、
1) 親スレッドで実行されたいcodeなのか、子スレッドで実行されたいコードなのかの見分けがつかない
2) というかそもそもRunnnable()ってのがよくわからない

sample programの原典はこちらです.ksksueさんが作ったPhysicaloidLibraryというライブラリです.この中にあるsample programのキモのところだけを抜き出したのが以下のcodeで、最上位のonCreate()から下層へ下がってゆきます.どうやら、スレッド処理が単純じゃないらしいです.

--------------
↓onCreate()はCのmain()みたいなもんです.簡単には、openして、serialを受信して、画面に表示させる無限ループになってます.
public class 中略 extends Activity {
  TextView tvRead;    画面の文字表示領域
  Physicaloid mPhysicaloid;   FT232などを動かすライブラリ
  Handler mHandler = new Handler();   あとで使うハンドラ

  protected void onCreate(中略) {   中略
     mPhysicaloid = new Physicaloid(this); ライブラリの実体を作る

     mPhysicaloid.open();     FT232RLをopenする

  以下の子スレッドルーチンを、とあるリストに追加する
     mPhysicaloid.addReadListener(new ReadLisener()
  リストに追加する子スレッドルーチン、ここから
     {
        public void onRead(int size)
        {
           byte[] buf = new byte[size];
           mPhysicaloid.read(buf, size);
           readStr = new String(buf, "UTF-8");
  子スレッドが親スレッドに以下のルーチンを動かさせるのがhandler.postの役割
           mHandler.post(new Runnable()
           {
  親スレッド=親スレッドなのでtvReadを描画できる
              public void run() tvRead.append(readStr); }
           });
        }
     }); 子スレッドここまで
   } // end onCreate
} // end class

このスレッドの扱い方は倒錯していて初心者をかな~り寄せ付け難くしていると思います.Androidでは、画面描画できるのは親スレッドだけです.このアプリではserial受信を子スレッドでやりますが(上記ブルー)、子スレッドは画面描画できませんから困ります.そこで、子スレッドが親スレッドに描画してくれと要求します(上記レッド).それに加えてスレッドルーチンのエントリポイントをリストに登録するというややこしいこともやってます.

↓上記のopen()がどうなっているかを調べますと、FTDIライブラリを直接呼び出してopenしています.FTDIライブラリの中身はブラックボックスですので放置プレイにしときます.するとstartRead()とななんぞやと疑問が湧きます.openしたら自動的にReadが始まるようです.
public boolean open() {
   ftDev = ftD2xx.openByIndex(mContext, USB_OPEN_INDEX);
   if(ftDev.isOpen()) {
      setBaudrate(mUartConfig.baudrate);
      startRead();
      return true;
   }
}

↓これがstartRead()です.ぶっちゃけmLoopという名の子スレッドを作り、mLoopの中にあるrun()を起動している.mLoopという子スレッドでFT232RLをreadしているようだ.
private void startRead() {
   new Thread(mLoop).start();
}

↓子スレッドmLoopがどうなっているかというと、これがmLoopの定義ですが、Runnableって何ですか?という疑問と、この書式がフツーに解説されるスレッドの表記と違うのでなんだかよくわかりません.無限にcallされるonRead()って何だろというのも疑問点.
private Runnable mLoop = new Runnable() {
   public void run() {
       for (;;) { 無限ループ
           len = ftDev.getQueueStatus(); // 受信文字数
           len = ftDev.read(rbuf,len,READ_WAIT_MS);
           onRead(len);
       }
   }
};
いろいろとネットを徘徊して簡潔に説明されているのがこちらのページです.スレッドを丁寧に宣言するのではなく、run()だけをサラッと記述するのがrunnableだそうです.ふ~ん、、、

無限にcallされるonRead()は何かというと、最初のonCreate()で子スレッドをリストに登録しましたよね.あれのことなんです.再掲するとこれです.
public void onRead(int size) {
    byte[] buf = new byte[size];
    mPhysicaloid.read(buf, size);
    readStr = new String(buf, "UTF-8");    読んで
    mHandler.post(new Runnable()
    {
       public void run() { tvRead.append(readStr); }  表示
    });
};

↓onCreate()でリスト登録していた関数はこれ.リストに追加してます.
public void addReadListener(ReadLisener listener) {
        uartReadListenerList.add(listener);
}

↓リストuartReadListenerListの定義はこれ.関数のエントリポイントがリストされている.
private List<ReadLisener> uartReadListenerList
        = new ArrayList<ReadLisener>();

リスナーとは、serialデータを受信するプログラムのことらしく、複数のプログラムを登録できるらしいが、このアプリでは1つだけしか登録しないらしい.まぁよくわからないのだがさておいてもよさそう.

というわけで、スレッドの構造はたぶんわかりました.

つぎはこれを簡素化してみようと思います.というか、スレッドでしか処理できないもんなんですかね? 利便性をさておけばそんなことはないはずなのですが.

かしこ


人気ブログランキングへ

17 件のコメント:

  1. threadの親子関係と異話題お許しください。threadの親子関係は、自分の勉強のため
    後で読んでみます。
    私が、良くないと思う、2chサイトが今日読めなくなっていました。
    自分にとって読め無く成った事は、+80%だと思います。

    人の意見を聞いているふりの出来ない人、聞かない人、無視する人は、私の嫌なタイプの
    人です。
    それと、私の考えのメインを認識せず少し関連が有る事を言って反論の様な曖昧な事を
    言う人(私の後妻?)も、嫌いなタイプです。

    2chの様な、他人の中傷の多いサイトをオープンさせて置くのは良くないと私は思うのですが?
    (中、高生、internet 利用者中の問題行動の是正と関係有るのか?国の文部との関連?)

    平坂久門さん、サイトの読者さんは、この点をどう考えますか?

    返信削除
    返信
    1. 2chがあってもなくてもわたしには関係ないので局外中立と思っています.推測ですが、当ブログの特定の記事のpvが激増することがあり、そのケースでは2chにリンクが張られているのではないかと推測するので、そういう意味では不労所得的に利益があるかなぁとは少し思いますけど、まぁどっちでもいいや.
      仮にわたしが2chで非難されたとしても、わたしは何とも思いません.仮に当ブログが炎上したとしてもわたしは何とも思いません.なぜなら、どう考えても現実に困ることが見当たらないからです.もしもどこかの会社に就職したら、上司から「君のブログでの発言に対する抗議が我が社宛に来ているんで、削除してくれたまえ」などと言われる可能性がありますが、今のところ固定的就職はしてませんのでその心配もないし.
      てなわけでー

      削除
  2. 私は平坂氏ほど読解力がないからかもしれませんが川名さんの文章は読みにくいと思います。いろいろ問題定義はされているのでしょう。では、論点はどこなのか。はてなマークは相手に対しての疑問なのかそれとも自問自答なのか。
    問題定義ーなぜ自分はそう思う(問題だと思う)のかと述べると一層相手も理解しやすいと思われます。
    また、2chですが、あくまでも仮想空間ですので誹謗中傷は仕方がないと思っております。嫌なら入らなければ良いわけだし。さらに言えば相手から頭ごなしに言われて、それに反論しようと思う方が意味のない事だと思います。ある意味、仮想でありながら現実の世界のようになっているのではないかと思ってしまいます。

    >私が、良くないと思う、2chサイトが今日読めなくなっていました。

    今日は朝から2chのサーバーが大規模にダウンしていたそうです。その影響ではないないでしょうか?

    返信削除
    返信
    1. 2chがダウンしてたんですか.もしやサイバー攻撃か...

      削除
    2. わたしもわからない文章はわからないので、わからないときはスルーしてます.
      自問自答と投げかけで論旨が止まってしまっている人はよく見かけます.わたしは中立・反対・賛成を行き当たりばったりで決めますけど、決められない人はよくいます.それはたぶん、次のような思考構造だからだと思います.
      1) 100%の判断材料が提示されたという確信が持てない限り判断しない
      2) 他に重大な判断材料を見落としているかもしれないので、判断を留保する
      3) そういうスタンスならばそもそも、100%の判断材料が提示されたかどうかの判断ができないという自己矛盾に陥っている
      つまり、頭も良いし知識もあるのに真面目すぎて決断できないということなのではないかと思います.断定・断言してしまう度胸不足なのではないかと.それもマジメの裏返しですが.

      削除
  3. 匿名さんの考え読みました。人の考え方理解する上の参考にさせて頂きます。
    まず、接続不可は、2chのサーバーが大規模にダウンとの事、納得しました。2chの様なチャンネルの利用の仕方、考え方は、匿名様、平坂様の考え方を私もしたいと思います。

    しかし、私が興味の有るサイトに来てまで、誹謗中傷を記述するのは、良く無いと考えます。私は、然程気にはしていませんが、気にしても改善は望めない事も承知。
    相手に、しなければ良いと言われるのも、ごもっともです。

    誹謗中傷箇所は
    http://s2jp.com/2013/01/tiny10-i2c-lcd/comment-page-2/

    内容
    matushige
    2014年2月14日 14:26

    futaba様初めまして。
    そこのkawanaという者ですが数々の電子工作系の掲示板やブログを
    荒らしまわっている非常に悪質な荒らしです。

    無視をしてもそのように意味不明の文字列をどんどん書き込んできますので
    アクセス禁止等を行い書き込ませない&書き込んできたら即削除を実施するといった
    断固たる措置をよろしくお願いいたします。

    川名 (futaba氏が判断する事で有り、第三者が言うべき事では無い)
    //-----------------------------------------------------------
    川名さんの文章は読みにくいと思います。少し理解しています。けして自分の文章が良いとは思っていません。文章は、省略せず、流を考え記述する事に心がけています。
    相手が読んで気持ちが良く、理解し易い文章にする事を心がけているのですが、

    文章最後の?は
    私は、こう思いますが主で、読んで下さった方は、どの様に思いますかの両方を意味しています。

    匿名さん、平坂氏のコメントに感謝致します。

    返信削除
  4. 接続出来ませんと言う範囲の広すぎる、メッセ-ジ ?(?削除する必要が有りますね)

    サ-バ-がダウンと言えない理由は、有るのかな、(アイコン消しちゃった、ごみ箱からも)
    見に行くのを止めよう、時間の無駄かも、

    返信削除
  5. 通信障害が発生しており、現在接続不可能に成っています。くらいのmessageが私は
    良いと思う。

    返信削除
  6. 問題定義----->問題提起として替えて読まして頂きました。

    返信削除
  7. Hello, the whole thing is going sound here and ofcourse every one
    is sharing facts, that's actually good, keep up writing.

    Feel free to visit my website - 10000amonthclub.com - -

    返信削除
  8. What's Happening i am new to this, I stumbled upon this I have found It
    absolutely useful and it has helped me out loads.
    I hope to give a contribution & aid different users like its aided
    me. Good job.

    Have a look at my website odawg.net ()

    返信削除
  9. Today, I went to the beach with my children. I found a sea shell and gave it to my 4
    year old daughter and said "You can hear the ocean if you put this to your ear." She placed the shell to her ear and screamed.

    There was a hermit crab inside and it pinched her ear.
    She never wants to go back! LoL I know this is entirely off topic but
    I had to tell someone!

    Also visit my site: Commercial Electricity []

    返信削除
  10. Write more, thats all I have to say. Literally,
    it seems as though you relied on the video to make your point.
    You definitely know what youre talking about, why waste your intelligence on just posting videos
    to your weblog when you could be giving us something enlightening to read?


    Feel free to surf to my web page :: click; http://avto-time.net,

    返信削除
  11. Hi, i think that i saw you visited my weblog thus i came to
    “return the favor”.I'm attempting to find things to
    improve my website!I suppose its ok to use a few of your
    ideas!!

    Visit my site: logbook loan

    返信削除
  12. I think this is one of the most important info for me.

    And i'm glad reading your article. But should remark on few general things, The site
    style is great, the articles is really great : D. Good job, cheers

    Have a look at my weblog :: logbook loan

    返信削除
  13. WOW just what I was searching for. Came here by searching for click
    (bestselfhelpbooksblog.com)

    返信削除
  14. It's going to be finish of mine day, however before
    ending I am reading this fantastic paragraph to improve my know-how.


    My web blog - blogarabe.net

    返信削除