2chブラウザ "CocoMonar"
■ このスレッドは過去ログ倉庫に格納されています
008882
02/01/25 20:04ID:iki37gEAとりあえず長いスレを表示中にスクロール用のボタンを押すと、一定時間操作不能になって描画が止まるのをなんとかしたくて、いろいろやってました。
これはThreadViewer-MoveAction#boundingRectForGlyphRangeの
return [lmanager_ boundingRectForGlyphRange : glyphRange
inTextContainer : container_];
に時間がかかってるためのようです。おそらくTextStorageにテキスト追加中はText関連はみんなlockされていて、その間にTextLayoutManagerにアクセスして待ちが発生してしまうものと思われます。
さらにこれはmain threadの処理なので、描画もストップするようです。
これをある程度解決するにはTHREAD_DATA_CONTENT_GENERATE_UNITを1とかにするのが手っ取り早いと思われます。50のときと時間を比べてみましたがそんなに違いはないと思います。
むしろ[[self threadContent] endEditing]で頻繁にunlockが行われることによりユーザーの操作に反応できるようになるメリットが大きいと思います。
で、これでいいと思ったんですが、よく止まるようになってしまいました。だめだ、、、。
既出の問題ですが、デッドロックになってます。
Thread1(main loop): [NSRecursiveLock lock]
Thread2: [NSViewHierarchyLock lock]
とかになって止まります。
Thread2はThreadViewer-MoveAction#glyphRangeForDocumentVisibleRectの
glyphRange_ =
[lmanager_ glyphRangeForBoundingRect : visibleRect_
inTextContainer : container_];
とかで止まってます。lockFocusIfCanDrawとかを入れてみたんですが、それでも止まります。
NSViewHierarchyLockはviewのlockってことがわかるんですが、Thread1のNSRecursiveLockがなんだかわかりません。text関連のlockだということは分かるんですが。
というわけでぜんぜん役に立ってないですな。スマソ
■ このスレッドは過去ログ倉庫に格納されています