home link download back number special issue

HMDT - Back Number / August, 2001


August, 2001


August 26 - Cocoa 1001、コンテキストメニュー、その 2
keywords: context menu

Cocoa 1001、コンテキストメニューの話の続き。ちょっとだけ。

NSMenu を用いた、コンテキストメニューを表示する方法です。実は、昨日から取り組んでいるのは、マウスを押しっぱなしにして、数秒後にコンテキストメニューを表示させる方法。ほら、IE とかでやられているようなやつ。あれをやろうとしていたんだよね。始めは mouseDown をオーバーライドすりゃ簡単じゃーん、って思ってたんだけど、どうもうまくいかない。ボタン押しっぱなしだと、mouseDown から抜けてこないんだね。中で while loop 回してるな、きっと。うーん、どうするのがいちばん手がかかんないかな。mouseDown を完全にこっちで再現してしまえばいいんだけど、それもちょっといやだしねー。

August 25 - Cocoa 1001、コンテキストメニュー
keywords: context menu

Cocoa 1001、コンテキストメニューの話っす。

環境が快適なっても、なかなかペースに乗れないよ。あー、時間が欲しいなぁ、、、

August 22 - 察しがいい
keywords: ???

察しがいいので反応する。PowerBook に入れたときはスリープさせるな。もちろん、「まだ」な!

August 19 - セルの中身を描く
keywords: drawInteriorWithFrame

Cocoa 1001 NSCell の続き。今回はセルの中身を描く話。

サンプルプログラムがついてるんだ。Apple から提供されている、OutlineView ってのがあるよね。フォルダのツリー構造を NSOutlineView で表示するやつ。あれに手を加えて、アイコンを表示させるようにしてみたよ。パフォーマンスが悪いところは、改善の余地あり。

金曜日に Apple から「ある物」が届いたので、インストールしてみた。うぉぉぉっ!これは快適だ!うそじゃなかった!始めからこのくらいで動いてほしかったよなー。期待して待て!

August 16 - Cocoa 1001、NSCell が保持する値
keywords: NSCell

Cocoa 1001 NSCell の続きです。きょうはセルが保持する値の話。

これ、API ドキュメントだけではいまひとつ分かりにくいんだけど、ヘッダと照らし合わせると、理解できるんだな。

August 14 - Cocoa 1001、NSCell の話
keywords: NSCell

お久っ!Cocoa 1001 だよ。だいぶ久しぶりの気がするな。NSCell 関係に手を入れてみました。今回は導入編というところで。

まだまだ、続くよっ!でも、最近更新頻度が落ちてるから、期待しないで待っててくれ。

August 10 - NSThread と pthread
keywords: NSThread, pthread

Apple から、Mac OS 9 と Mac OS X のスレッド・アーキテクチャに関するドキュメントが公開されたよ。Mac OS X のスレッド・アーキテクチャに関するところは、なかなか面白い。Mac OS X では、5 つの異なるスレッド API が実装されていることになるんだ。Mach、pthread、Cocoa、Carbon MP、Carbon cooperative だ。これらを全部動かそうってんだから、けっこう無茶なことやるね。

基本的に、これらの API は階層的に配置されている。一番下が Mach、その上に pthread。あとの 3 つは pthread の上に配置される。その状態を表しているのが、下の図だ。

さて、Cocoa プログラムでは、Cocoa API スレッド(NSThread)と、pthread のどちらでも使っていい、と書いてある。ここではそれらの API を比較してみて、どっちを使うべきか考えてみよう。pthread API は、/usr/include/pthread.h から、NSThread はドキュメントから調べることができるよ。

pthread のうち、スレッドの生成、操作に関わる API は以下の通り。

  • pthread_create()
  • pthread_join()
  • pthread_detach()
  • pthread_equal()
  • pthread_exit()
  • pthread_cancel()
  • pthread_once()
  • pthread_self()

そして、NSThread の API は以下の通り。

  • currentThread
  • detachNewThreadSelector
  • sleepUntilDate
  • exit

おそらく、NSThread の currentThread は pthread_self() を使って、exit は pthread_exit() を使ってるでしょう。注目すべきは、スレッド生成用の API だ。

NSThread で、新しいスレッドを生成する API は detachNewThreadSelector だけだ。これは、名前の通り、新しいスレッドを作って detach(親スレッドから切り離す)する。たぶん、pthread_create() と pthread_detach() を使っているね。で、NSThread には join 系の API がないんだ。つまり、NSThread を使う限り、作られるスレッドは常に detach されてて、join されてるスレッドは作れないことになる。

join は UNIX でいうところの WAIT に相当するものだ。これを使うと、親スレッドは子スレッドの終了を待つことができる。たとえば、シェルでプロセスを起動すると、明示的に切り離さない限り、子プロセスが終了するまで待ってるでしょ。あんな感じだ、たぶん。

このような、UNIX 的なスレッドの親子関係を意識したいときは pthread を、そうじゃないときは NSThread を使う、といった感じで使い分ければいいのかな。


Home | Link | Download | Back Number | Speciall Issue

mailto: mkino@xd5.so-net.ne.jp

HMDT