問題タブ [dwscript]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - DWScript: Delphi 側からメタ クラス パラメータを読み取る方法
DWScript でのメタ クラスの使用に問題があります。
スクリプトを使用して、VAR とエンド ユーザーがアプリケーションをカスタマイズできるようにしています。
私たちのアプリケーション データは、基本的にツリー構造の小さなオブジェクトで構成されています。各オブジェクトは、データを表示するだけの「ダム」であるか、または何らかの方法でインテリジェントである可能性があります。インテリジェンスは、さまざまなスクリプト クラスをツリー オブジェクトに関連付けることにより、スクリプトで実装されます。
私が抱えている問題は、オブジェクトを実装するためにどのスクリプト クラスを使用する必要があるかを、スクリプトが Delphi サイド フレームワークに伝える必要があることです。基本的には、スクリプト メタ クラスを Delphi 側に渡し、そこに情報を安全に永続化できる形式で保存する必要があります (型名で、おそらく文字列として)。また、逆方向に移動できるようにする必要があります。つまり、メタ クラスを Delphi 側からスクリプトに返します。
TdwsUnit 宣言
スクリプト
Delphi の実装
メタクラスの宣言、TItemClass
. で完了TdwsUnit.OnAfterInitUnitTable
。
RegisterItemClass
実装
問題は、メタ クラス パラメータから TSymbol を取得する方法です。
編集:この古い質問で、問題の一部に対する答えを見つけました。
要するに、解決策は、パラメーター値を a にキャストすることですTSymbol
。
でも...
クラス名を文字列として保存するとします。このクラス名からシンボルに戻すにはどうすればよいですか? これが必要な理由は、スクリプトが (上記のコードを使用して) アイテム クラスを設定できるのと同様に、スクリプトがアイテムのクラスを要求することもできるからです。
必要なことを行うと思われる4つの異なる方法のいずれかを使用してシンボルテーブルを調べてみましたが、いずれもシンボルを見つけることができません。
問題は、スクリプトで宣言されたメタ クラスの名前が与えられた場合、Delphi 側から対応する TSymbol を取得するにはどうすればよいかということです。
編集:最後の部分に対する1つの可能な解決策を見つけました。
以下はうまくいくようですが、それが正しい方法であるかどうかはわかりません。シンボル検索の範囲を現在のスクリプト ユニットに限定する必要があると考えたでしょう。
dwscript - DWScript 単純なテキスト ファイルの書き込み/読み取り
dwscript を使用して単純なテキスト ファイルを読み書きしたいと考えています。私のコードは以下にあります...しかし、私はそれを実行することができません.誰かが助けてください...:
delphi - DWSWebServer でスクリプト RTTI を使用する
現時点では、DWSWebServer で少し遊んでいます。Pascal スタイルの言語で動的な Web サイトをコーディングするというアイデアがとても気に入っています。ここで、script-side-RTTI を使用して単純な ORM を実装したいと思います。しかし、スクリプト コンパイラは RTTI 関数またはクラスを認識しません。
たとえば、次のコードを試してみると:
私は手に入れます:
Web サーバーの最新バージョンを正常にコンパイルしましたが、RTTI をサポートするために必要なオプションやライブラリがありませんか?
ご協力いただきありがとうございます
delphi - DWScript、Monkey Patching: 実行時にメソッドまたはプロパティを追加
現在、DWScript + SQLite の ORM マッピングを作成しています。通常のプロパティ (文字列や整数など) のマッピングを正常に実装しましたが、外部キーと多対多の関係を追加したいと考えています。このために、クラス A で外部キープロパティを宣言し、実行時にクラス B に関係マネージャーを追加して、関係をモデル化することを計画しました。ソースコードのクラス B に関係マネージャーを配置できることはわかっていますが、フレームワークで宣言されたユーザー モデルへの外部キーを持つモデルがアプリケーションにあると想像してください。新しいアプリケーションごとにフレームワークを変更するのは現実的ではありません。
私の質問: スクリプトの実行時に新しいプロパティ、フィールド、または関数をオブジェクト/クラスに追加するにはどうすればよいですか?
説明するためのコードを次に示します。
delphi - Record であるプロパティの DWScript セッター
私の問題は非常に単純です。私はこのコードを持つ dwsUnit を持っています:
mc.Position.X (または Position.Y または Z) で次を取得します。
これはどういう意味ですか?がプロパティの場合、レコードは読み取り専用ですか? そして、Delphi 側からアクセスする方法。(2番目の問題、それほど大したことではありません)
delphi - マジック関数からオブジェクトを渡す
dwscript で TStringList を使用する必要があります。
コンパイルされた Delphi コードでは、両方を使用します
と
ここで、genSL は TStringList を作成して入力します。
これを dwscript で使用したいのですが、genSL から TStringList を返すのに問題があります。
どうやら2つのアプローチがあるようです。
1 RTTI を使用
デルファイで私は書く
そしてコールバックで
これにより、外部で作成された TStringList をスクリプトに渡すことができます。
問題:スクリプトで、リストを RTTIVariant として宣言する必要があります。
実際には TStringList であるため、これは誤解を招きます (また、既存のコードを変更せずに使用したいと考えています)。スクリプトで List を TStringList として宣言することをお勧めします。
2 TStringList を dwsUnit に公開する
デルファイで私は書く
スクリプトでは、TStringList を作成して使用できます。
しかし、TStringList-y を返す魔法の関数を宣言することはできません。
デルファイ コード:
およびスクリプトコード:
問題:これにより、スクリプトのコンパイルがSyntax Error: Incompatible types: Cannot assign "TStringList" to "TStringList"で中止されます
私は何かが欠けていると思います。どちらにも必要なもの
- オブジェクトを RTTIVariant 以外のものとして宣言して、オブジェクトをそれに渡します
また
- スクリプトに渡せるように型を導入しますか?
私は2013年7月にチェックアウトされたdwscript-svnでDelphi 2010を使用しています(最近のsvnはd2010でコンパイルされませんでした)。任意の提案をいただければ幸いです。
json - マルチスレッドのメモリ割り当て/割り当て解除が集中するアプリケーションがスレッド数に応じてスケーリングしないのはなぜですか?
知らせ:
元の投稿タイトル
DWScript のマルチスレッド JSON パーサーがスレッド数に応じて拡張されないのはなぜですか?
この問題はDWScript を使用した JSON データの処理に関連していないため、変更されました。問題は、Delphi XE2 から XE7 (テストは XE2 と試用版 XE7 ) のデフォルトのメモリ マネージャーにありますが、このようなアプリケーションで最初に問題が発生しました。
Delphi XE2 で JSON データを処理するマルチスレッドの Win32/Win64 vcl アプリケーションがあります。
各スレッドは、DWScript を使用して JSON データを解析しTdwsJSONValue.ParseString(sJSON)
、DWScript メソッドを使用して値を読み取り、結果をレコードとして保存します。
テスト目的で、各スレッドで同じ JSON データを処理します。
単一スレッドの実行ではN
、スレッド内でデータを処理するのに数秒かかります。スレッド数を線形にM
増やすと (約M * N
)、単一スレッド内で同じデータを処理するのに必要な時間が増加します。
その結果、速度の向上はありません。このアプリケーションの他の部分 (JSON データ配信、ターゲット環境への結果の保存) - 期待どおりにスケーリングします。
理由は何ですか?どんなアイデアでも大歓迎です。
補足情報:
Win7/32 および Win7/64、Win8/64 の 2 コアから 12 コア (HT なし) システムでテスト済み
DWScript が利用可能な最速のものとして選択されました (その中には Superobject、組み込みの Delphi などをテストしました)。SO は、DWS の JSON ユニットと同様に動作します。
以下は、問題を示す完全なコンソール アプリです。これを実行するには、 https ://www.dropbox.com/s/4iuv87ytpcdugk6/json1.zip?dl=0 で入手できるサンプル json データが必要です。このファイルには
json1.dat
、最初のスレッドのデータが含まれています。スレッド数が 16 までの場合は、json1.dat を json2.dat...json16.dat にコピーするだけです。プログラムとデータは同じフォルダにある必要があります。実行するには: convert.exe N (N はスレッド数)。
プログラムは実行時間 (ミリ秒単位) を stout に書き込みます - スレッドで費やされた時間、データの解析時間、TdwsJSONValue オブジェクトの解放 (破棄) 時間。ステートメント
_dwsjvData.Destroy;
はスケーリングしません。
delphi - DWScript: IScriptObj から IInfo または TProgramInfo への取得
参照が与えられた場合、対応するorIScriptObj
にどのように到達しますか?IInfo
TProgramInfo
Delphi オブジェクトをラップするスクリプト オブジェクトがあります。
スクリプト オブジェクトの存続期間を管理するために、Delphi オブジェクトはスクリプト オブジェクトへの参照を格納します。Script オブジェクトはTdwsUnit
コンポーネントで宣言されます。それはかなり標準的で、次のようになります。
デルファイ
脚本
Delphi オブジェクトのインスタンス化と Delphi/スクリプト リンクの設定は、スクリプト オブジェクト コンストラクタの Delphi 実装で行われます。また、かなり標準的です:
デルファイ
理想的には、後で必要なすべてを実行するのではなく、参照を保存したはずですが、経験から、オブジェクトIInfo
はメソッド呼び出しの間のみ有効であるようです。IScriptObj
IInfo
IInfo
とにかく、TDelphiObject.DoSomething
Delphi 側で が呼び出されたときに問題が発生します。
TDelphiObject.DoSomething
スクリプト オブジェクトで対応する仮想メソッドを呼び出すためのものです。
デルファイ
IInfo
使用可能なものを取得するため、またはTProgramInfo
保存されたものを取得するためにさまざまな手法を試しましたIScriptObj
が、すべてが失敗しました。それで、これを行う正しい方法は何ですか?