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
A do czego ci to kolego potrzebne w Androidzie? Chyba nie do sprawdzania czy dana aplikacja jest już uruchomiona i zabezpieczenia przed podwójnym uruchomieniem?
@robertz68:
jest mi to potrzebne, aplikacja wielowątkowa i synchronizacja dostępu do wspólnego zasobu
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
Może klasa TMonitor z modułu System coś pomoże.
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.TMonitor
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.