Bezskutecznie szukam w necie informacji o czymś na podobieństwo semafora, sekcji krytycznej albu mutexu dla aplikacji FMX (Android) w D 10.2 lub D10.4.
Może ktoś coś podpowie
- Rejestracja:ponad 14 lat
- Ostatnio:około 24 godziny
- Rejestracja:ponad 14 lat
- Ostatnio:około 24 godziny
@robertz68:
jest mi to potrzebne, aplikacja wielowątkowa i synchronizacja dostępu do wspólnego zasobu

- Rejestracja:ponad 17 lat
- Ostatnio:około 22 godziny
- Postów:1597
Może ktoś mnie poprawi ale semafory i mutexy to chyba jest stricte windowsowe rozwiązanie i na androidzie chyba inaczej się to realizuje ale doświadczenia w tej kwestii nie mam

- Rejestracja:ponad 9 lat
- Ostatnio:5 miesięcy
- Postów:130
Może klasa TMonitor z modułu System coś pomoże.
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.TMonitor
- Rejestracja:ponad 14 lat
- Ostatnio:około 24 godziny
Dziękuję wszyskim którzy próbowali pomóc w rozwiązaniu problemu.
Udało mi się rozwiązać problem stosując klasę "TInterlocked".
kod realizujący blokady
unit lock;
interface
uses System.SyncObjs;
function lockData: integer;
function unlockData: integer;
implementation
var
lockFlag: integer;
function lockData: integer;
begin
result := TInterlocked.Increment(lockFlag);
if result = 1 then
exit;
TInterlocked.decrement(lockFlag);
result := 0;
end;
function unlockData: integer;
begin
result := TInterlocked.decrement(lockFlag);
end;
initialization
lockFlag := 0;
end.
kod testowego wątku
testowym obiektem wymagającym wyłączności na dostęp jest globalna zmienna 'lockCount' typu integer
type TTestThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TTestThread.Execute;
begin
inherited;
while not self.Terminated do
begin
if lockData = 1 then
try
Inc(lockCount);
try
if lockCount <> 1 then
self.Synchronize(
procedure
begin
Form1.Memo1.Lines.Add(datetimetostr(now) + ' ' +
inttostr(lockCount))
end);
sleep(random(100));
finally
dec(lockCount);
end;
finally
unlockData;
end;
sleep(random(100));
end;
end;
procedura testująca
var lockCount:integer;
......
......
procedure TForm1.Button8Click(Sender: TObject);
var
i: integer;
begin
randomize;
lockCount := 0;
for i := 1 to 50 do
TTestThread.create;
end;
Wiem że metodzie testującej tworzę 50 wątków, które nie są kończone i zwalniane. To jest tylko test mechanizmu blokowania. W aplikacji finalnej coś takiego jest niedopuszczalne
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.