mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
Fix window geometry scaling and close deadlock
This commit is contained in:
+14
-61
@@ -319,55 +319,6 @@ begin
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
// ===========================================================================
|
||||
// Синхронизация через отдельные классы-посредники (без анонимных процедур)
|
||||
// ===========================================================================
|
||||
|
||||
type
|
||||
{ TStatusSync - передаёт HP Status в главный поток }
|
||||
TStatusSync = class
|
||||
private
|
||||
FCallback: TOnHPStatus;
|
||||
FStatus: THighPriorityStatus;
|
||||
public
|
||||
constructor Create(CB: TOnHPStatus; const St: THighPriorityStatus);
|
||||
procedure Execute;
|
||||
end;
|
||||
|
||||
{ TMicSync - передаёт Mic данные в главный поток }
|
||||
TMicSync = class
|
||||
private
|
||||
FCallback: TOnMicPacket;
|
||||
FPkt: TMicDataPacket;
|
||||
public
|
||||
constructor Create(CB: TOnMicPacket; const P: TMicDataPacket);
|
||||
procedure Execute;
|
||||
end;
|
||||
|
||||
constructor TStatusSync.Create(CB: TOnHPStatus; const St: THighPriorityStatus);
|
||||
begin
|
||||
inherited Create;
|
||||
FCallback := CB;
|
||||
FStatus := St;
|
||||
end;
|
||||
|
||||
procedure TStatusSync.Execute;
|
||||
begin
|
||||
if Assigned(FCallback) then FCallback(FStatus);
|
||||
end;
|
||||
|
||||
constructor TMicSync.Create(CB: TOnMicPacket; const P: TMicDataPacket);
|
||||
begin
|
||||
inherited Create;
|
||||
FCallback := CB;
|
||||
FPkt := P;
|
||||
end;
|
||||
|
||||
procedure TMicSync.Execute;
|
||||
begin
|
||||
if Assigned(FCallback) then FCallback(FPkt);
|
||||
end;
|
||||
|
||||
// ===========================================================================
|
||||
// Receive thread
|
||||
// ===========================================================================
|
||||
@@ -994,12 +945,22 @@ begin
|
||||
end;
|
||||
|
||||
procedure THPSDRNetwork.StopThreads;
|
||||
procedure WaitThreadDone(T: TThread);
|
||||
begin
|
||||
if T = nil then Exit;
|
||||
if GetCurrentThreadId = MainThreadID then
|
||||
begin
|
||||
while not T.Finished do
|
||||
CheckSynchronize(10);
|
||||
end;
|
||||
T.WaitFor;
|
||||
end;
|
||||
begin
|
||||
if Assigned(FDUCIQThread) then
|
||||
begin
|
||||
FDUCIQThread.Terminate;
|
||||
RTLEventSetEvent(FDUCIQSem);
|
||||
FDUCIQThread.WaitFor;
|
||||
WaitThreadDone(FDUCIQThread);
|
||||
FreeAndNil(FDUCIQThread);
|
||||
end;
|
||||
|
||||
@@ -1011,13 +972,13 @@ begin
|
||||
CloseSocket(FSocket);
|
||||
FSocket := SOCK_INVALID;
|
||||
end;
|
||||
FReceiveThread.WaitFor;
|
||||
WaitThreadDone(FReceiveThread);
|
||||
FreeAndNil(FReceiveThread);
|
||||
end;
|
||||
if Assigned(FKeepaliveThread) then
|
||||
begin
|
||||
FKeepaliveThread.Terminate;
|
||||
FKeepaliveThread.WaitFor;
|
||||
WaitThreadDone(FKeepaliveThread);
|
||||
FreeAndNil(FKeepaliveThread);
|
||||
end;
|
||||
ResetDUCIQQueue;
|
||||
@@ -1033,18 +994,10 @@ end;
|
||||
procedure THPSDRNetwork.HandleHPStatus(const Buf: array of Byte; Len: Integer);
|
||||
var
|
||||
St: THighPriorityStatus;
|
||||
Sync: TStatusSync;
|
||||
M: TThreadMethod;
|
||||
begin
|
||||
if not Assigned(FOnHPStatus) then Exit;
|
||||
Move(Buf[0], St, SizeOf(St));
|
||||
Sync := TStatusSync.Create(FOnHPStatus, St);
|
||||
try
|
||||
M := Sync.Execute;
|
||||
TThread.Synchronize(nil, M);
|
||||
finally
|
||||
Sync.Free;
|
||||
end;
|
||||
FOnHPStatus(St);
|
||||
end;
|
||||
|
||||
procedure THPSDRNetwork.HandleDDCIQ(const Buf: array of Byte; Len: Integer;
|
||||
|
||||
Reference in New Issue
Block a user