FMX, Criticalsection, Mutex, Semaphore

0

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

0

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?

0

@robertz68:
jest mi to potrzebne, aplikacja wielowątkowa i synchronizacja dostępu do wspólnego zasobu

1

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

1

Może klasa TMonitor z modułu System coś pomoże.
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.TMonitor

1

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1