Jump to content

c0d3r

Members
  • Content Count

    137
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by c0d3r


  1. 1 hour ago, Steve Maughan said:

    I made the mistake of updating as soon as it was released. After installing (all default option) I found it had scrubbed my Win64 component path. The Win32 path is in tact but it'll be a right old pain to manually copy between the two. Also had to re-install OnGuard and Konopka components via GetIt (a modest pain).

     

    Be warned,

     

    Steve

     

    Yeah,  all my win64 component paths were wiped out.  Luckily, I had backup the registry before upgrade, so re-import the registry solves.

    • Thanks 1

  2. 1 hour ago, Remy Lebeau said:

    That is why I keep asking you to SHOW YOUR CODE (or at least a small demo that reproduces the same issue).  We can't tell you what is wrong if we can't see what you are actually doing.

    No.  It is your responsibility to not write code that blocks the socket threads from terminating properly.

    @Remy Lebeau I would like to give the codes, but I'm not allow to, they are kbmMW codes, all socket threads related things are done by kbmMW components internally.  What we did was just wrote codes in one of its OnRequest event handler to deal with client request by the given request name,  and set the return Result.  For each request, We made 100% sure to have try--finally--end blocks to have objects created get freed properly, each LockList to has a matched UnlockList to access thread string lists, ..., etc.   Anyway,  Thanks for your time to anwser all my questions, really appreciated!

     

    The codes in ProcessRequest event:   

    @ServiceMethod := MethodAddress(AClientRequestName);
    if Assigned(ServiceMethod) then
    begin
      Result := ServiceMethod(Self, ClientIdent, Args);
      Handled := True;
    end;

     

    This one of the request codes we wrote (in published section):

     

    function TMyService.GetSequenceValue(const ClientIdent: TkbmMWClientIdentity;
      const Args: array of Variant): Variant;
    var
      ds: TkbmMWDataset;
      SeqName, Step: string;
      SeqList: TStringList;
      i: Integer;
    begin
      Result := -1;
      if not PrepareQuery(SEQUENCE_GETVALUE, ds) then Exit;
      try
        SeqName := VarToStr(Args[0]);
        Step := VarToStr(Args[1]);
        SeqList := FSequences.LockList;
        try
          i := SeqList.IndexOfName(SeqName);
          if i < 0 then Exit;
          SeqName := SeqList.ValueFromIndex[i];
        finally
          FSequences.UnlockList;
        end;
    
        ds.Query.Text := Format(ds.Query.Text, [SeqName, Step]);
        ds.Open;
    
        if not ds.Eof then
          Result := ds.FieldByName('ID').AsInteger;
      finally
        ds.Free;
      end;
    end;

     


  3. 3 hours ago, Remy Lebeau said:

    Well, then that goes back to my earlier question - what do those methods actually look like?  Because there is likely a deadlock happening inside one of them, preventing one or more socket threads from terminating correctly, thus causing the TIdTCPServer.Active property setter to hang waiting for it.

     

    @Remy Lebeau  Thanks, I totally agree it.  just not sure how to find.  Any workarounds we can do?  Is there any properties/methods in TidTCPServer that can let all these socket threads being terminated gracefully before calling FSocket.Active := False; 


  4. 17 minutes ago, Remy Lebeau said:

    You can't use TIdTCPServer without at least an OnExecute event handler, otherwise setting the Active property to true will raise an EIdTCPNoOnExecute exception.  Are you suggesting that your OnExecute handler is blank, doing nothing at all?

    I'm not familiar with kbmMW, why are you using TIdTCPServer at all if it does nothing?  I don't understand the rational here.

    As I said earlier, setting TIdTCPServer.Active to False will handle the disconnect of active client sockets, closing the listening sockets, and waiting for their threads to fully terminate.

    Sorry, I didn't make it clear.  its the kbmMWTCPIPIndyServerTransport that use its FSocket: TidTCPServer,  to handle everything using some private/protected/public methods, including Execute event. e.g.

     

    TransportServer.Listen ->  FSocket.Active := True;

     

    TransportServer.Close -> FSocket.Active := False;

     


  5. 5 hours ago, Kas Ob. said:

    My thought on this, and i never used the library, so it is a guess work

    Getting FIN_WAIT_1 should have triggered a flag somewhere, so it is one of the following

    1) An exception was raised and you silently ignoring it, or the kbmMW did ignored it silently, and that is wrong, this is unlikely by the library.

    2) kbmMW is capturing it and passing it to an event to be handled or observed, and you missed assigning such event (callback)

    3) kbmMW is buggy, it is unlikely, i think such library is already mature enough after all these years to miss such basic functionality.

     

    Also here from this

    I think there is something missing, here because calling TransportServer.Close ; should not be that simple to handle exactly these cases where there is an active connection, so it either you should be calling something before Close like Dissconnect, abort, StopListen... or Close itself can have a parameter like Close(True), that is the right and normal design for any sockets handling library, unless there is some properties can be should be control this process of closing/disconnecting.

     

    in any case, i think you should refer to the documentation, browse the demos and look for the right way to close/terminate.

     

    No Disconnect/StopListen method,  only Listen and Close,  and the codes were there for 10+ years since 2007,  people who use our old app (built with Delphi 2007, Indy 9) are still working great.  Its those people who upgraded to our new app (built with Delphi 10.4.1, Indy 10) are having the issue.


  6. 8 hours ago, chmichael said:

    cod3r are you sure that it isn't a kbmMW bug that you should report to Kim ?

    As usual I sent email to Kim last week, no response.  Wish me luck if I get response.  Try registrating to its forum to ask questions, nope,  my work email was used and can't register,  try 'Forgot/Lost Password' link,  Oops,  your email doesn't exist.  I sent email to Kim about registration issue on Sunday,  lets see when I would get the response, so far no any response. 

     

    EDIT:   Oh, Oh,  the only email I can always get from him was the email that asking me to pay the annual subscription fee on due date.


  7. 54 minutes ago, Remy Lebeau said:

    That usually happens if you cause a thread deadlock inside your TIdTCPServer event handlers.  For instance, by syncing with the same thread that is trying to deactivate the server.  The Active setter closes all open client sockets, AND waits for the owning threads to terminate.  The server events are fired in the context of those threads.  So, either don't perform thread-blocking syncs during server shutdown, or else do the server deactivatation in a separate thread so the syncs can be processed normally.

    TIdTCPServer shutdown hasn't really changed between Indy 9 and 10.  Sure, the underlying architecture is a bit different, but the basics are still the same.  Although, you might have been getting saved by the TIdTCPServer.TerminateWaitTime property in Indy 9, which defaulted to 5 seconds.  If the server shutdown exceeded that timeout, an EIdTerminateThreadTimeout exception would be raised, maybe your service was crashing  and you just didn't notice it before?  That property doesn't exist in Indy 10.

    Can you show what your TIdTCPServer event handlers are doing?

    @Remy Lebeau Thanks for the answers.  Much appreciated.  We didn't write any codes for any TidTCPServer event handlers.  The TransportServer is a TkbmMWTCPIPIndyServerTransport object, it uses TIdTCPServer internally as its Socket instance. What we did was that in OnServiceStartEvent, calling TransportServer.Listen (which calls TidTCPServer.Active := True),  and in OnServiceStopEvent,  calling TransportServer.Close (which calls TidTCPServer.Active := False),  kbmMW handles everything else underneath (dealing with client side requests/server side responses).

     

    As for TerminateWaitTime property default to 5 seconds,  we never set or change it by any chance,  I thought Windows service timeout was set way longer (at least 30 seconds, we tested 90 seconds in the past) than TerminateWaitTime.  The hard part was that we can't reproduce on our development machines.  Only some of our customers who were heavily using the servers were having the issue.  We don't know how to debug at this point and where we should look at from.

     


  8. 42 minutes ago, ertank said:

    Hello,

     

    I am trying to provide client library for FirebirdSQL database connection for a MARS-Server project. I tried a few different INI parameters, all failed including second line below

    
    FireDAC.MAIN_DB.DriverID=FB
    FireDAC.MAIN_DB.VendorLib="C:\Program Files\Firebird\Firebird_2_5\WOW64\fbclient.dll"
    FireDAC.MAIN_DB.Database=C:\Program Files\Firebird\Firebird_2_5\examples\empbuild\EMPLOYEE.FDB
    

    I wonder what I should be using to be able to use a fbclient.dll in another directory than the EXE file.

     

    Thanks & Regards,

    Ertan

     

    Yes. you can as long as fbclient.dll is the right one.


  9. During last whole week, I tried to find what could be possible to cause my Windows service timeout while calling TidTCPServer.Active := False,  I'm using Delphi 10.4.1,  codes were working fine in Delphi 2007 with Indy 9+ until we migrated to 10.4.1:

     

    procedure TMyService.OnStop(...)

    begin

        TransportServer.Close ;  <-- Error 1053 occurs.

    end;

     

    TransportServer is a type of TkbmMWTCPIPIndyServerTransport, the Close method internally was just calling TidTCPServer.Active := False;

     

    I can't figure it out because if i don't stop the service,  it would serves the client requests/responses without any issue for weeks until at the point the users want to stop the service.


  10. Solved the issue, but I don't understand the reason why, I had like:

     

    SaveIndex := SaveDC(Canvas.Handle);

    try

       IntersectClipRect(Canvas.Handle, .....);

       PaintRows(Canvas, ...);

    finally

        RestoreDC(Canvas.Handle, SaveIndex);

    end;

     

    The codes in procedure PaintRows:

     

    SaveIndex2 := SaveDC(ACanvas.Handle);

    try

       IntersectClipRect(ACanvas.Handle, .....);

       .....

       PaintCells(ACanvas, ...);

       ......

    finally

        RestoreDC(ACanvas.Handle, SaveIndex2);

    end;

     

    By removing the SaveDC/RestoreDC from procedure PaintRows, it solves,  but Why?   can't nest call SaveDC/RestoreDC??


  11. 13 minutes ago, Anders Melander said:

    I know the SaveDC/RestoreDC doesn't solve your problem. In my code it's just there to leave the canvas in the same state as it was in when I got it. The key point from my code was the clearing of the pen handle since in my case I had problems with the pen color.

     

    Try reversing the order of the pen and brush assignments. I've had similar problems and as far as I remember that was what I did to solve it.

    Tried reversing the order of pen and brush assignments,  doesn't work either.


  12. @Anders Melander tried yours but still the same issue:

    procedure DrawTriangle(ACanvas: TCanvas; AColor: TColor; ARect: TRect);
    var
      SaveIndex: Integer;
    begin
      ACanvas.Lock;
      try
        SaveIndex := SaveDC(ACanvas.Handle);
        try
          ACanvas.Brush.Style := bsSolid;
          ACanvas.Brush.Color := clBlack;
          ACanvas.Pen.Color := clBlack;
          ACanvas.Polygon([Point(ARect.Right - 1, ARect.Bottom - 10), Point(ARect.Right - 1, ARect.Bottom - 1),
                           Point(ARect.Right - 10, ARect.Bottom - 1)]);
        finally
          RestoreDC(ACanvas.Handle, SaveIndex);
        end;
      finally
       ACanvas.Unlock;
      end;
    end;

     

    image.thumb.png.810ea1b34fbad1c20bd867f31b97c51a.png


  13. Hi,

     

    For the last couple of days I tried figure out the issue about Canvas.Polygon wasn't working properly.   Here is my routine:

     

    procedure DrawTriangle(ACanvas: TCanvas; AColor: TColor; ARect: TRect);
    begin
      ACanvas.Brush.Style := bsSolid;
      ACanvas.Brush.Color := ColorToRGB(clRed); //ColorToRGB(AColor);
      ACanvas.Pen.Color := ColorToRGB(clRed); //ColorToRGB(AColor);
      //ACanvas.Pen.Mode := pmCopy;
      ACanvas.Polygon([Point(ARect.Right - 1, ARect.Bottom - 10), Point(ARect.Right - 1, ARect.Bottom - 1),
                       Point(ARect.Right - 10, ARect.Bottom - 1)]);
    end;

     

    if I passed clRed as one of the Color parameter on the red background, it drawed a white triangle,  as you see from the below screenshot,. It was only painted right at the most right column.  Even I hard coded to set color to clRed, it still drawed a white triangle.

     

     

    DrawTriangle.thumb.PNG.6dc35b19d4ba2bd4f07621d6839ff546.PNG

     

     

    I just can't figure out what I was doing wrong.

     


  14. Nature:

     

    The brick red represents: Flowers,  The green: Forest, the orange/yellow: Moon/Sun,  the cream white: Clouds,  the dark blue background:  Deep ocean,   the light green (blueish, used for comments) : Rivers.  the brown white space:  earth.  the Sky blue brace pair highlight: The Sky.  The red error lines:  Fire.

     

    Editor2.thumb.PNG.eb599010d31ab6b7f4b2e5c2ddb909c8.PNG

     

    File:

     

    c0d3r-YW-Nature.theme.xml

     

     

    • Like 3

  15. Some one is asking for my themes, so I thought its better to create a new post to benefit any one who like them, I called them "Nature" themes,  one Nature original theme and one Nature Warm theme, you may use Delphi IDE theme editor (https://github.com/RRUZ/delphi-ide-theme-editor) to apply them:

     

    Please click Like if you enjoy it.

     

    Nature warm (based on my Nature original theme):

     

    1.thumb.PNG.cee2a497e285af36aec5bde388c297f1.PNG

     

    File:

     

    c0d3r-YW-Nature-warm.theme.xml

     

     

    • Like 3
×