Jump to content

Recommended Posts

Geschrieben

Moin aus Hamburg.

 

Ich habe folgendes Problem :

 

ich erstelle Objekte vom Typ TBrickMaster, TBrickAnalogOut, AnalogIn ... im Ereignis On Create des Formulars

var
  HOST : String;
  PORT : Word;
  EnumBrick : array[1..128] of TEnumerateB;
  EnumCount : Word;
  ipcon : TIPConnection;
  ma : array[1..8] of TBrickMaster;
  mb : array[1..8] of TBrickDC;
  aa : array[1..8] of TBrickletAnalogIn;
  ab : array[1..8] of TBrickletAnalogInV2;
  ac : array[1..8] of TBrickletAnalogOut;
  ad : array[1..8] of TBrickletAnalogOutV2;
  ae : array[1..8] of TBrickletIndustrialDual020mA;
  da : array[1..8] of TBrickletIO4;
  db : array[1..8] of TBrickletIO16;

procedure TfrmMain.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  frmMain.ClientWidth := 1008;
  frmMain.ClientHeight := 730;
  Log := TStringList.Create;
  Log.Add(DateTimeToStr(Now) + ' Programm started');
  HOST := 'localhost';
  PORT := 4223;
  EnumCount := 0;

  ipcon := TIPConnection.Create;

  ma[1] := TBrickMaster.Create('6qY3SC', ipcon);
  ma[2] := TBrickMaster.Create('6JKRPw', ipcon);

  ab[1] := TBrickletAnalogInV2.Create('vfA', ipcon);
  ac[1] := TBrickletAnalogOut.Create('hPy', ipcon);
  ac[2] := TBrickletAnalogOut.Create('ikS', ipcon);
  ad[1] := TBrickletAnalogOutV2.Create('vn2', ipcon);
  ae[1] := TBrickletIndustrialDual020mA.Create('saE', ipcon);
  db[1] := TBrickletIO16.Create('snY', ipcon);

  ipcon.Connect('localhost', 4223);

 

soweit so gut.

 

Im Ereignis OnClose setze ich einige Einstellungen zurück und gebe die

Objekte wieder frei :

 

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SetIO16PortsToZero(1); // alle Ausgänge auf HIGH
  SetAnalogesToZero; // Analog Ausgänge auf 0V
  
  ab[1].Free;
  ac[2].Free;
  ac[1].Free;
  ad[1].Free;
  ae[1].Free;
  db[1].Free;
  ma[2].Free;
  ma[1].Free;

  Delay(100);
  ipcon.Destroy;
  Delay(100);
  Log.Free;
end;

 

dies funktioniert auch einwandfrei, solange ich von einem Bricklet-Typ

nur ein Objekt erzeuge. benutze ich zwei Objekte vom z.B. Typ

TBrickletAnalogOut

gibt's eine Exception bei der Freigabe bzw. Destroy von ipcon

an folgender Stelle :

 

Unit IPConnection

procedure TIPConnection.Disconnect;
var callback_: PCallbackContext; meta: TByteArray;
begin
  callback_ := nil;
  socketMutex.Acquire;
  try
    autoReconnectAllowed := false;
    if (autoReconnectPending) then begin
      { Abort pending auto-reconnect }
      autoReconnectPending := false;
    end
    else begin
      if (not IsConnected) then begin
        raise ENotConnectedException.Create('Not connected');
      end;
      DisconnectUnlocked;
      SetLength(pendingData, 0);
    end;
    { Destroy callback thread }
    callback_ := callback;
    callback := nil;
  finally
    socketMutex.Release;
  end;
  if (callback_ <> nil) then begin
    { Do this outside of socketMutex to allow calling (dis-)connect from
      the callbacks while blocking on the WaitFor call here }
    SetLength(meta, 2);
    meta[0] := IPCON_CALLBACK_DISCONNECTED;
    meta[1] := IPCON_DISCONNECT_REASON_REQUEST;
    callback_^.queue.Enqueue(IPCON_QUEUE_KIND_META, meta);
    if (not callback_^.thread.IsCurrent) then begin
      callback_^.queue.Enqueue(IPCON_QUEUE_KIND_EXIT, nil);
      callback_^.thread.WaitFor;
      callback_^.thread.Destroy; <-------------- hier tritt der Fehler auf
    end
    else begin
      callback_^.queue.Enqueue(IPCON_QUEUE_KIND_DESTROY_AND_EXIT, nil);
    end;
  end;
end;

 

kennt jemand das Problem bzw. hat eine Lösung ?

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...