Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: xinyiman - Marzo 22, 2014, 06:31:49 pm

Titolo: errore multithreading
Inserito da: xinyiman - Marzo 22, 2014, 06:31:49 pm
Ciao ragazzi, ho un programma che in funzione della configurazione carica una form piuttosto che un altra. Solo che in entrambi i casi deve lanciare una funzinone in multithreading e in questa funzione lancio questa procedura.

Codice: [Seleziona]
procedure TBaseThread.SetSonoUscitoDalCicloLetturaFile(valore: boolean);
begin
     try
        try
           if Trim(UpperCase(Form1.GetConfigurazione('START_VENDITA')))='TRUE' then
           begin
             EnterCriticalsection(unit_Principale.Frm_Principale.ACriticalSection);
             unit_Principale.Frm_Principale.SonoUscitoDalCicloLetturaFile:=valore;
             LeaveCriticalsection(unit_Principale.Frm_Principale.ACriticalSection);
           end
           else
           begin
             EnterCriticalsection(Principale.Frm_PrincipaleGetBilancia.ACriticalSection);
             Principale.Frm_PrincipaleGetBilancia.SonoUscitoDalCicloLetturaFile:=valore;
             LeaveCriticalsection(Principale.Frm_PrincipaleGetBilancia.ACriticalSection);
           end;
        finally
       end;
     except
           on E: Exception do
           begin
              //codice da eseguire solo se si verifica un eccezzione
              Self.Log('Errore funzione SetSonoUscitoDalCicloLetturaFile ' + E.Message);
           end;
     end;
end;

Quando  Trim(UpperCase(Form1.GetConfigurazione('START_VENDITA')))  ritorna TRUE funziona bene tutto, quando ritorna FALSE restituisce questo errore

Il progetto Cassa ha sollevato un eccezzione di classe 'external: SIGSEGV'.

At address 7C911010

Ovviamente questo errore avviene quando eseguo

             EnterCriticalsection(Principale.Frm_PrincipaleGetBilancia.ACriticalSection);

Chi mi sa dire cosa puņ essere?!
Titolo: Re:errore multithreading
Inserito da: nomorelogic - Marzo 22, 2014, 09:19:27 pm
non c'entra molto con l'errore ma dovresti mettere il LeaveCriticalSection in un blocco try...finally

riguardo l'errore, hai chiamato preventivamente InitCriticalSection nel caso "FALSE"?

Codice: [Seleziona]
   EnterCriticalsection(unit_Principale.Frm_Principale.ACriticalSection);
   try
      unit_Principale.Frm_Principale.SonoUscitoDalCicloLetturaFile:=valore;
   finally
      LeaveCriticalsection(unit_Principale.Frm_Principale.ACriticalSection);
   end
Titolo: Re:errore multithreading
Inserito da: El Salvador - Marzo 22, 2014, 09:43:38 pm
E' un access violation. Sicuro che esista Frm_PrincipaleGetBilancia e Frm_PrincipaleGetBilancia.ACriticalSection al momento dell'esecuzione del codice?
Titolo: Re:errore multithreading
Inserito da: xinyiman - Aprile 06, 2014, 03:52:45 pm
Scusate se ci ho messo un po' ma ho avuto altro da fare, io nella unit chiamata principale ho la procedura

procedure TFrm_PrincipaleGetBilancia.FormCreate(Sender: TObject);
begin

InitCriticalSection(ACriticalSection);

end;

Poi lancio la procedura che mi crea il problema da un Timer che parte all'avvio del form