안녕하세요.
델파이를 시작한지 얼마되지 않는 델초가 고수님께 도움을 요청합니다.
아래 소스는 음성 채팅에서 Winshoes로 음성 데이터를 입력받는 부분입니다.
개별 Compile을 할 경우에는 Error가 발생하지 않는데 Server로 부터 입력을 받도록 2개의 프로그램을 구동하면 Free를 시켜주지 못해서 Error가 발생하는 것 같습니다.
어제 하루종일 생각하다 해결을 못하고 이렇게 질문을 올립니다.
FreeMem구문은 버퍼를 다 사용한 뒤에 사용해야 된다는 것은 알 겠는데 구체적으로 어떻게 해야 될지????
Free를 시켜주기 위해서는 아래 소스를 어떤식으로 수정해야 되는지 알고싶습니다.
(질문을 위해서 source를 약간 수정했습니다.)
고수님들의 조언을 바라는 델초.....
미리 인사드립니다. 감사합니다.
그럼. 20000.
procedure TPlayer.UDPClientListenerUDPRead(Sender: TObject; const psData,
psPeer: String; const piPort: Integer);
var
tempMem : PChar;
begin
if FDeviceOpened = true then begin
GetMem(tempMem, WAVE_BUFSIZE);
try
if length(trim(psData)) > 0 then begin
tempMem := PChar(psData); // Server로 부터 음성입력.
OutWaveMem[OutBufIndex] := tempMem;
//OutWaveMem은 전역변수(array [0..3] of PChar).=> circular buffer를 사용.
FWaveOutOpened := true;
end;
if FWaveOutOpened then begin
QueueNextBuffer; //음성출력루틴을 포함하고 있는 procedure.
FWaveOutOpened := false;
end;
finally
FreeMem(tempMem); // 이 부분.???
end;
end
end;
조금 이상하군요.... GetMem으로 메모리 블럭을 할당받은후에 바로 psData를 대입해
버리는 군여. 그럼 할당받은 메모리 블럭을 잃어버리는데요. 메모리릭이 생깁니다.
StrCopy, Move같은 함수를 사용해서 복사를 해주어야합니다.
이런것은 컴파일할때는 에러가 나지 않습니다. 문법적으로는 문제가 없으니까요...
^^ 항상 즐코하세요.
김용민 wrote:
> 안녕하세요.
> 델파이를 시작한지 얼마되지 않는 델초가 고수님께 도움을 요청합니다.
> 아래 소스는 음성 채팅에서 Winshoes로 음성 데이터를 입력받는 부분입니다.
> 개별 Compile을 할 경우에는 Error가 발생하지 않는데 Server로 부터 입력을 받도록 2개의 프로그램을 구동하면 Free를 시켜주지 못해서 Error가 발생하는 것 같습니다.
> 어제 하루종일 생각하다 해결을 못하고 이렇게 질문을 올립니다.
> FreeMem구문은 버퍼를 다 사용한 뒤에 사용해야 된다는 것은 알 겠는데 구체적으로 어떻게 해야 될지????
> Free를 시켜주기 위해서는 아래 소스를 어떤식으로 수정해야 되는지 알고싶습니다.
> (질문을 위해서 source를 약간 수정했습니다.)
>
> 고수님들의 조언을 바라는 델초.....
> 미리 인사드립니다. 감사합니다.
> 그럼. 20000.
>
>
> procedure TPlayer.UDPClientListenerUDPRead(Sender: TObject; const psData,
> psPeer: String; const piPort: Integer);
> var
> tempMem : PChar;
> begin
> if FDeviceOpened = true then begin
> GetMem(tempMem, WAVE_BUFSIZE);
> try
> if length(trim(psData)) > 0 then begin
> tempMem := PChar(psData); // Server로 부터 음성입력.
> OutWaveMem[OutBufIndex] := tempMem;
> //OutWaveMem은 전역변수(array [0..3] of PChar).=> circular buffer를 사용.
> FWaveOutOpened := true;
> end;
>
> if FWaveOutOpened then begin
> QueueNextBuffer; //음성출력루틴을 포함하고 있는 procedure.
> FWaveOutOpened := false;
> end;
> finally
> FreeMem(tempMem); // 이 부분.???
> end;
> end
> end;