Jump to content

[Delphi] Exception beim Freigeben von ipcon


markus5766h

Recommended Posts

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 ?

 

Link to comment
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...