Scintilla/Direct access

Last-modified: 2008-02-25 (月) 20:56:56

ダイレクトアクセス

  • SCI_GETDIRECTFUNCTION
  • SCI_GETDIRECTPOINTER

Windowsで、コンテナとScintilla間で通信に使われるメッセージ受け渡し体系は、オペレーティングシステムのSendMessage関数によって調停され、集中して呼ぶ場合に性能が悪くなる。
このオーバーヘッドを避けるために、ScintillaはScintillaメッセージ関数を直接呼ぶことができるようメッセージを提供する。
C/C++でこれを行うコードは次のようになる:

#include "Scintilla.h"
SciFnDirect pSciMsg = (SciFnDirect)SendMessage(hSciWnd, SCI_GETDIRECTFUNCTION, 0, 0);
sptr_t pSciWndData = (sptr_t)SendMessage(hSciWnd, SCI_GETDIRECTPOINTER, 0, 0);
// now a wrapper to call Scintilla directly
sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
    return pSciMsg(pSciWndData, iMessage, wParam, lParam);
}

SciFnDirect、sptr_tおよびuptr_tはScintilla.hで宣言される。
hSciWndは、Scintillaウインドウを生成したときに返されるウインドウハンドルである。


より速い間、ウインドウスレッドに連動するように異なったスレッドからネイティブのケースSendMessage(hSciWnd, SCI_*, wParam, lParam)が使用されるべきであるScintillaウインドウのスレッドまで実行されると、このダイレクト呼び出しは問題を起こすだろう。


この特徴はGTK+でも働くが、速度でどんな重要な影響も与えない。


Windowsのバージョン1.47から、ScintillaはSCI_GETDIRECTFUNCTIONによって返される関数と同じように使用できるScintilla_DirectFunctionと呼ばれる関数をエクスポートする。
これはSCI_GETDIRECTFUNCTIONへの呼び出しと間接的に関数ポインタを通してScintillaを呼ぶ必要性を節約する。

SCI_GETDIRECTFUNCTION

このメッセージはWindowsメッセージシステムを通り抜けるオーバーヘッドなしでScintillaメッセージを扱うために呼ぶ機能のアドレスを返す。
あなたは、Scintillaウインドウを生成する数に関係なく一度呼ぶだけでよい。

SCI_GETDIRECTPOINTER

これはどのScintillaウインドウが使用中かを特定するデータのポインタを返す。
それぞれのScintillaウインドウを生成したときに、一度呼ばなければならない。
ダイレクト関数を呼ぶとき、対象ウインドウに関連するダイレクトポインタに渡さなければならない。