私はIndyソケットを介してパケット文字列をストリーミングして作業しており、クライアント側には、から着信データを読み取り、TIdTCPClient
このデータを単一の文字列バッファーの最後に継続的に追加するスレッドがあります。このバッファを最初から継続的に読み取り、必要に応じてデータをコピー(および削除)する別のスレッドがあります(一度に1つの完全なパケット)。
いずれにせよ、同じ変数にアクセスする2つのスレッドは危険である可能性があることを私は知っています。しかし、これは文字列にも当てはまりますか?それともオブジェクトだけですか?2つの異なるスレッドからの同じ文字列のこの読み取り/書き込みで安全に感じることができますか?そうでない場合は、この文字列を保護するために何をすべきですか?これは、と呼ばれるプレーンな文字列FBuffer
です。
私は次のように最後にデータを追加しています:
procedure TListenThread.CheckForData;
begin
if FClientSocket.Connected then begin
FClientSocket.IOHandler.CheckForDataOnSource(5000);
if not FClientSocket.IOHandler.InputBufferIsEmpty then
FBuffer:= FBuffer + FClientSocket.IOHandler.InputBufferAsString;
end;
end;
そして、他のスレッドはそれを次のように読んでいます:
procedeure TPacketThread.CheckForPacket;
var
P: Integer; //Deliminator position
T: String; //Temp copying string
Z: Integer; //Expected packet size
begin
P:= Pos('#', FBuffer);
if P > 0 then begin //Is the deliminator found?
T:= Copy(FBuffer, 1, P-1); //Copy up to deliminator...
Z:= StrToIntDef(T, 0); //Convert packet size to integer...
if Z > 0 then begin
//Is there a full packet waiting in buffer?
if Length(FBuffer) >= Z then begin
//First, delete size definition and deliminator...
Delete(FBuffer, 1, P);
//Now grab the rest of it up to the packet size...
T:= Copy(FBuffer, 1, Z);
//Delete what we just copied...
Delete(FBuffer, 1, Z);
//Finally, pass this packet string for further processing...
ProcessPacket(T);
end;
end;
end;
end;
このコードは、で行う必要のあるすべての作業を示すために、コードを簡略化したものですFBuffer
。