答えて
TIdHTTPServer
はマルチスレッドコンポーネントです。 TIdContext
は、それ自身のワーカースレッドで実行されます。フォームのCaption
を安全に更新することはできません(またはUIで他の操作を行う)ことは、メインスレッドの外部から行うことはできません。 TIdSync
またはTIdNotify
クラスなど、メインスレッドと同期する必要があります。
ループでReadChar()
を呼び出すのは非常に効率が悪く、代理ペアのデータを返すことができないため、Delphi 2009+を使用している場合はエラーが発生しやすくなります。
代わりにこのようなものを使用してください。
type
TDataNotify = class(TIdNotify)
protected
Data: String;
procedure DoNotify; override;
public
constructor Create(const S: String);
class procedure DataAvailable(const S: String);
end;
constructor TDataNotify.Create(const S: String);
begin
inherited Create;
Data := S;
end;
procedure TDataNotify.DoNotify;
begin
frmMain.Caption := Data;
frmMain.Memo1.Lines.Add(Data);
end;
class procedure TDataNotify.DataAvailable(const S: String);
begin
Create(S).Notify;
end;
procedure TfrmMain.srvrConnect(AContext: TIdContext); //idhttpserver on connect event
var
S: String;
begin
AContext.Connection.IOHandler.CheckForDataOnSource(IdTimeoutDefault);
if not AContext.Connection.IOHandler.InputBufferIsEmpty then
begin
S := AContext.Connection.IOHandler.InputBufferAsString;
TDataNotify.DataAvailable(S);
end;
end;
wierdしかし、私はAContext.Connection.IOHandler.InputBufferAsStringで何も受け取りません。私が書いたものを使用すれば、それはうまく動作します...何故なのでしょう? – opc0de
'InputBufferAsString'は、現在' InputBuffer'にあるものをすべて取り出し、それを 'String'に変換します。 D2009 +では、バイトをUnicodeにデコードする必要があります。バイトに不完全な文字列が含まれているなど、そのデコードが失敗した場合、空の 'String'が返される可能性があります。内部的には、デコーディングはEmbarcaderoの 'TEncoding'クラスに基づいており、これらのクラスはデコードエラーで例外を発生させません。だから本当の疑問は、あなたが最初に受けようとしているデータの種類と、一度に1文字ずつ読もうとした理由です。 –
私はgpsからデータを受信していますので、文字列はasciiのようにエンコードされていません – opc0de
まず、正しい変数に書き込んでいることを確認してください。 frmMain
はキャプションを変更するフォームですか?
また、あなたが試みることができる:
procedure TfrmMain.srvrConnect(AContext: TIdContext); //idhttpserver on connect event
var
S,C : String;
begin
repeat
s := s + AContext.Connection.Socket.ReadChar;
until AContext.Connection.Socket.InputBufferIsEmpty = True;
oCaption := S;
TThread.Synchronize(nil, Self.ChangeCaption);
end;
procedure TfrmMain.ChangeCaption;
begin
Self.Caption := oCaption;
Memo1.Lines.Add(oCaption);
end;
そして最後に、フォームのキャプションは、改行が含まれている文字列が表示されませんのでS
上の最初の行は、空白行でないことを確認してください。
UIを安全に更新することはできません(TIdContext'が実行される)ワーカースレッド、および 'Application.ProcessMessages()'はワーカースレッドから呼び出されたときにメインUIを更新しません。 –
@RemyLebeau、そうです。私はそれを変更するつもりです。 –
'TForm'は' Synchronize() 'メソッドを持たず、' ChangeCaption() 'は' TfrmMain'クラスのメンバではありません。私はあなたの答えを更新しました。 –
- 1. は、私はこの単純なコード持っているC
- 2. フォームは、私は私がcart.phpにリダイレクトすることになっているフォームを持っているが、それは動作していない
- 3. フォームは、私がHTML(index.htmlを)で、この簡単なフォームを持っている
- 4. はJavascriptが私がここに取り組んできたこのサイトを持っているポップアップ
- 5. フォームは、私はここに同様の記事を見てきましたが、私はので、私は私が尋ねるだろうと思って私の問題を解決する運を持っていないjqtouch
- 6. は、これは私が持っているコードです
- 7. )これは私が持っているコードですjqueryの
- 8. は、私はこの非常に単純なコードを持っているポインタ
- 9. が、私はこのような単純な形を持っているprototypejs
- 10. は、私はこの単純なコードを持っている碧玉
- 11. 私は私のコードでこの行を持っている
- 12. cmakeのフラグと、私はこの単純なコード持って
- 13. が、私はここに掲載のと同様の問題を抱えている
- 14. AVCaptureDevice focusPointOfInterestが、私はこのコードでIBActionを持っている
- 15. オペラ9と、私は単純なコードを持っているイベント
- 16. 表は、私は(私はそれが非常に簡単だと思う、しかし、私はそれを解決することはできません)この問題を持っているテキストをリサイズするが、それはいけない
- 17. 私は私が間違っているつもりどこ把握することはできません。このコードのエラーを持っているPROCEDUREエラー
- 18. 単純な正規表現は、私がこれを持って
- 19. log4jは、すべてのそれは私が持っている私のlog4j.propertiesで
- 20. Knockout.js fromJSONは、私は私が働いている次のような単純なケース持っているのViewModel
- 21. 待って、その後、私は、コードを持っているフォーム
- 22. 私はこのコードを持っているファイルで同じファイル
- 23. 私は、このクラスを持っているが、私はクリックリスナーなしでリストビューアイテムを取得することはできませんリストビュー
- 24. 持っIBOutletが、私はこのコードを持っていることに
- 25. 文字エンコーディング私は、単純なHTMLフォームを持っている
- 26. は、なぜ私は/私はこのようなコードを持っているC
- 27. がHttpContext.Current.User.IsInRole私はこのコードを持っている私のコントローラAuthController /サインインで
- 28. 取扱いは、私は、この例のコードを持ってasp.net
- 29. カントは、私はNexus Oneの上のAndroid 4.0.3に取り組んでこのコードを持っているアンドロイド2.2
- 30. JsonIgnorePropertiesは、私は、次の単純なクラスを持っている
IIRC IdHTTPServerのは、読み取り/書き込みので、何が必要か、サーバーによって作成されたスレッド内の要求/応答を処理するTIdContextのサブクラスを作成することであり、それから、あなたが行うことができ、コンテキスト内で場所を取る必要がありますあなたがする必要があるものは、私が少し前に書いた小さなデモです。http://www.delphigeist.com/2010/12/dynamic-web-pages-with-dwscript-and.html – ComputerSaysNo