0
在我解釋我的問題之前,我很抱歉我的英語不好。 好的,這裏是我的問題。當我的印服務器將位圖幀的客戶,總是出現警告這樣的:爲什麼當發送位圖幀到MemoryStream到客戶端時出現警告?
「EAccessViolation地址004DD42A ......」
和錯誤語法藍色高亮顯示在此:
Athread.Connection.WriteInteger(MemoryStream.Size);
這裏我的源代碼:
服務器
procedure TFormHome.TCPServerConnect(AThread: TIdPeerThread);
var
NewClient: PClient;
begin
GetMem(NewClient, SizeOf(TClient));
NewClient.PeerIP := AThread.Connection.Socket.Binding.PeerIP;
NewClient.HostName := GStack.WSGetHostByAddr(NewClient.PeerIP);
NewClient.Connected := Now;
NewClient.LastAction := NewClient.Connected;
NewClient.Thread := AThread;
AThread.Data := TObject(NewClient);
try
Clients.LockList.Add(NewClient);
finally
Clients.UnlockList;
end;
procedure TFormHome.TCPServerExecute(AThread: TIdPeerThread);
var
pesan:string;
begin
pesan:=Athread.Connection.ReadLn;
if pesan = 'video' then
begin
Athread.Connection.WriteLn('send');
Timer1.Enabled:=true;
FormStream.Show;
Athread.Connection.WriteInteger(MemoryStream.Size);
Athread.Connection.OpenWriteBuffer;
Athread.Connection.WriteStream(MemoryStream);
AThread.Connection.CloseWriteBuffer;
FreeAndNil(MemoryStream);
FormStream.Image1.Picture.Bitmap.Free;
end;
procedure TFormHome.Timer1Timer(Sender: TObject);
begin
pic := TBitmap.Create;
MemoryStream:=TMemoryStream.Create;
VideoGrabber.GetBitmap(FormStream.image1.Picture.Bitmap);
pic := FormStream.Image1.Picture.Bitmap;
pic.SaveToStream(MemoryStream);
//Pic.Free;
//FreeAndNil(Pic);
end;
CLIENT
procedure TFormClient.TCPClientConnected(Sender: TObject);
var
pesan : string;
begin
IncomingMessages.Lines.Insert(0,'Connected to Server');
TCPClient.WriteLn('video');
pesan := TCPClient.ReadLn;
if pesan = 'send' then Timer1.Enabled:=true;
end;
procedure TFormClient.Timer1Timer(Sender: TObject);
var
Size : integer;
ReadStream : TMemoryStream;
begin
ReadStream := TMemoryStream.Create;
Size := TCPClient.ReadInteger;
TCPClient.ReadStream(ReadStream,Size,True);
Image1.Picture.Bitmap.LoadFromStream(ReadStream);
Image1.Picture.Bitmap.Free;
FreeAndNil(ReadStream);
end;
什麼是錯的難熬我的代碼?我需要你的幫助。
之前謝謝你.. ^^
我有點困惑這個代碼:類型 TLogNotify = A類(TIdNotify) 保護 程序DoNotify;覆蓋; public Msg:String; 結束; –
當我把這段代碼放在初始聲明中時,警告出現它找不到TidNotify標識符。 –
'TIdNotify'位於'IdSync.pas'單元中。它是一個工具類,可以幫助工作線程異步地在主線程中運行代碼,類似於'TThread.Queue()'。還有一個'TIdSync'類用於在主線程中同步運行代碼,類似於TThread.Synchronize()。在大多數Delphi版本中使用'TIdNotify'和'TIdSync'的優點是能夠傳遞數據,TThread.Queue()和TThread.Synchronize()直到最近才引入匿名過程。 –