Fix window geometry scaling and close deadlock

This commit is contained in:
2026-05-24 16:19:22 +03:00
parent 0dc04ffcad
commit 8624116f0c
3 changed files with 75 additions and 73 deletions
+14 -61
View File
@@ -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;