問題タブ [tstream]
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 - StringList 内のオブジェクトとしての TStream
私は Delphi 7 を使用しており、TStream をオブジェクトとして StringList で遊んでいます。
私のテスト プロジェクトには、ListBox、メモ、および 2 つのボタン (追加と削除) があります。
これが私がこれまでに得たものです:
ListBox をダブルクリックすると、選択した項目の Stream オブジェクトを Memo にロードしたいと思います。これが私がやろうとしたことです:
私の質問は次のとおりです。
StringList 内の TStream オブジェクトを追加および削除 (解放) する方法は正しいですか? たぶん、最初にストリームを解放してからオブジェクトを解放する必要がありますか??
FormDestroy イベントですべてのオブジェクトを解放する方法は正しいですか?
ストリームを Memo (Memo.Lines.LoadFromStream(TStream(List.Objects[Idx]))) にロードしようとすると、Stream.Size が 0 より大きいにもかかわらずロードされません。私が間違っていることは何ですか?
delphi - http サーバーからカスタム ストリームを読み取るために TStream を使用する場合のランダムな遅延
Sony Remote Api をサポートするカメラに接続するために、TIdHttp (Indy コンポーネントから) を使用しています。カメラは、HTTP GET コマンドの応答としてライブ ビュー ストリームを http 接続に送信します。TStream サブクラスを作成し、それをストリーミング クラスとして使用しました。ライブ ストリームに接続するためのコードは次のとおりです。
TLiveStream クラスの定義は次のとおりです。
プログラムはライブ ストリームに正常に接続され、カメラからのライブ ビューの受信を開始します。ただし、カメラからの受信を 5 秒間ランダムに停止します (プログラムはアイドル状態で、フリーズしません)。TIdHttp をICSの THttpCli に置き換えましたが、問題は解決しません。
どんな助けでも大歓迎です!
編集:
curl ツールを使用して問題がプログラム内にあるかどうかを調べましたが、問題は残りました。カメラと PC の間で送信されるパケットを盗聴します。遅延時間のスクリーンショットは次のとおりです。
copy - Lazarus でのストリームのクローン作成 / コピー / 複製
TStream を受け取るプロシージャを開発しました。ただし、すべてのタイプのストリーム相続人の送信を許可するための基本タイプ。
この手順は、各コアに 1 つのスレッド、または複数のスレッドを作成することを目的としています。各スレッドはストリーム データ (読み取り専用) の詳細な分析を実行します。Pascal クラスは参照によって割り当てられ、値によって割り当てられることはないため、読み取り位置がインターカラーであるため、スレッドの衝突が発生します。
これを修正するには、メモリ内の最後の TStream を 2 倍にして新しい変数を割り当てる手順をすべて実行する必要があります。このようにして、各スレッドが一意の TStream を持つように TStream を十分な数だけ複製できます。非常にスレッド ライブラリ メモリの終了後。
注: 手順は DLL 内にあり、スレッドは機能します。
注 2: 目標は、プロシージャが必要なサービスをすべて実行することです。TStreamだけでなく、TStream の配列を簡単に渡すことができます。でも欲しくない!目的は、サービスが完全に手順によって提供されることです。
これを行う方法はありますか?
ありがとうございました。
添加:
低レベルのアイデアはありましたが、Pascal に関する知識は限られています。
- メモリ内のオブジェクトのアドレスとそのサイズを特定します。
- 元のオブジェクトと同じサイズの新しいアドレスをメモリに作成します。
- コンテンツ (生) オブジェクト全体をこの新しいアドレスにコピーします。
- メモリ内のこの新しいアドレスを指す TStream へのポインタを作成します。
これは機能しますか、それともばかですか?? はいの場合、操作方法は?例 お願いします!
2º 追加:
例として、プログラムが暗号化されたストリームに対してブルート フォース攻撃を実行するとします (適用できないため、単なる例です)。
シーン: 8 コアの CPU で 30GB のファイル:
1º - TMemoryStream:
8 つの TMemoryStream を作成し、各 TMemoryStream のファイルの内容全体をコピーします。これにより、240GB RAM が同時に使用されることになります。私はこの壊れた考えを考えます。さらに、マルチスレッドを使用しないと、処理時間が最速のポイントまで増加します。ファイル全体をメモリに読み込んでロードし、分析を開始する必要がありました。壊れた!
* TMemoryStream の不適切な代替手段は、メモリを占有しないように、ファイルを 100MB/コア (800MB) ずつ TMemoryStream にゆっくりとコピーすることです。したがって、各スレッドは 100MB しか見えず、ファイル全体を完了するまでメモリを解放します。しかし問題は、DLL で Synchronize() 関数が必要になることです。これは、Synchronize () で質問を開くと、うまくいかないことがわかっています。DLL はエラーなしでフリーズし、クラッシュします。
2º - TFileStream:
これは私の意見では悪いです。TStream を取得し、8 つの TFileStream を作成して、各 TFileStream の 30GB をすべてコピーします。ディスク上で 240GB を占有するため、これは大きな値であり、HDD に対してもです。HD での読み取りおよび書き込み時間 (コピー) により、マルチスレッドの実装はシングル スレッドよりも時間がかかることが判明します。壊れた!
結論: 上記の 2 つの方法では、synchronize() を使用して各スレッドをキューに入れ、ファイルを読み取る必要があります。したがって、マルチコア CPU でも、スレッドは同時に動作しません。彼がファイルに同時にアクセスできたとしても (複数の TFileStream を直接作成する)、オペレーティング システムはファイルを一度に 1 つずつ読み取るために依然として enfileiraria スレッドを実行します。HDD は完全にスレッドセーフではないため、彼は 2 つのデータを読み取ることはできません。同時に 。これは HDD の物理的な制限です。ただし、OS のキューイング管理は、手動で synchronize() を実装する場合とは異なり、はるかに効果的であり、潜在的なボトルネックを効率的に減らします。これは、TStream のクローンを作成するという私の考えを正当化するものであり、ファイル アクセス キューを管理するためのすべての作業を SO に任せることになります。何の介入もなしに。
例
上記の例では、8 つのスレッドが同じ Stream を異なる方法で同時に分析する必要があります。スレッドは、提供された Stream の種類を認識していないため、ファイル Stream、インターネットからのストリーム、または小さな TStringStream でさえある可能性があります。メイン プログラムは、1 つのストリアンのみを作成し、構成パラメーターを使用します。簡単な例:
たとえば、ストリーム M1 のみ、M2 のみ、または両方 [M1、M2] を分析できる必要があります。TModesFB 構成は、ストリームの分析方法を変更します。タスクリストとして機能する配列「modes」の各項目は、異なるスレッドによって処理されます。タスク リストの例 (JSON 表現):
注: アナライザーでは [m1] + [m2] <> [m1, m2]。
プログラム内:
DLL の場合:
注: シングル スレッドの場合、プログラムは問題なく動作し、既知のエラーはありません。
各スレッドに特定のタイプの分析を処理してもらいたいのですが、DLL で Synchronize() を使用できません。理解?適切でクリーンなソリューションはありますか?
delphi - ストリームへの/からの画像の保存/読み込み中のデルファイでのアクセス違反エラー
Delphiでアプリケーションを開発しています。データベースに保存されている画像を抽出して保存し、動的に入力される他のフォームに配置されたコントロールにTMemoryStream
同じ画像をロードしようとしています。ストリームからフォームに配置されたイメージ コントロールにイメージをロードしようとすると、アクセス違反エラーが発生しTImage
ます。
エラーの説明は次のとおりです
モジュール abc.exe のアドレス 00B548C でアクセス違反が発生しました。アドレス 0000000 の読み取り
私のコードスニペットは次のとおりです
delphi - TFileStream と TMemoryStream の両方から派生するにはどうすればよいですか?
TFileStream から継承するクラスと TMemoryStream から継承するクラスがあります。どちらも、データの読み取りに関するまったく同じ機能を実装しています。
いずれかのタイプのストリームをパラメーターとして受け取る関数を作成する場合は、TStream を使用する必要があります。
これはもちろん、カスタム関数を使用できないことを意味します。これに対処する最善の方法は何ですか?理想的には、FileStream または MemoryStream のいずれかで動作する Tstream 互換クラスを使用できるようにしたいので、このようなことを行うことができ、ストリームが FileStream であるか MemoryStream であるかは問題になりません。
arrays - Delphi - ストリームを使用して大規模な動的配列をディスクに書き込む
Delphi プログラムでは、4,000,000,001 カーディナルを持つ動的配列があります。私はそれをドライブに書き込もうとしています(そして後で読み込もうとしています)。私は以下を使用しました:
それは次のように爆撃しました: ...「ストリーム書き込みエラー」というメッセージで例外クラス EWriteError を発生させました。
書き込んだファイルのサイズはわずか 3,042,089KB です。
私は何か間違ったことをしていますか?一度に書き込めるサイズ(3GB程度)に制限はありますか?
delphi - ResourceStream をストリームにコピー
このコードで助けが必要です
これはすべてのコードです
リクエスト: TIdHTTPRequestInfo
応答: TIdHTTPResponseInfo
JQuery: TResourceStream
エラー: TStream.Seek が実装されていません
問題は、TStream のコピー TResourceStream にあります。