Jump to content

FredS

Members
  • Content Count

    430
  • Joined

  • Last visited

  • Days Won

    4

Posts posted by FredS


  1. 2 hours ago, Dalija Prasnikar said:

    closed bug reports I made about LF issues

    Changed that option then used Notepad++ to generate 4 lines with LF only, pasted into 10.3.3, saved and opened the file in Notepad++, LF still terminates two of the line endings.
     

    File another bug report? 🙂


  2. 1 hour ago, Pawel Piotrowski said:

    NOT thread Safe

     

    Been on the back of my mind since I read Marco's book but I never had to deal with strings where a lock wasn't used.

    However, if the main thread (mt) only reads and a worker thread (wt) only writes this should be fine.

     

    The way I see this is that when the wt writes to a string variable if first makes a reference copy of the original. If the mt reads that string it gets the old value while its being written to.
    Once the write lock is off the string var now points to the new string and when the mt tries to read it the next time around it gets a reference to that string.

     

    A quick test is below, I used a Cursive Number method to make the string more complex for the test, I know a version of that is available here somewhere.
    Unfortunately the version available does not reverse from Text. But you can simply replace these three calls with CurrToStr/StrToCurr.

     

    Guess I  could let that run a bit longer and see if there are any collisions..

     

    //MMWIN:MEMBERSCOPY
    unit _MM_Copy_Buffer_;
    
    interface
    
    type
      THelperTests = class(TObject)
      public
        [Test]
        [TestCase('10k', '10000')]
        procedure TestStringThreadSafe(Iterations: Integer);
      end;
    
    
    implementation
    
    procedure THelperTests.TestStringThreadSafe(Iterations: Integer);
    var
      c, LastReadC : Currency;
      s : string;
      HasTerminated : Boolean;
      i : integer;
    const IncBy = 1000;
    begin
    //  Assert.IsTrue(TAtomic.IsNatural(c, SizeOf(c)), 'Currency will only work in x64');
    
      c := 1000.34;
      s := TCursiveNumbers.ToText(c);
    
      {- Reading }
      TThread.CreateAnonymousThread( procedure
        var rS : string; CurrentC  : Currency;
        begin
          LastReadC := c;
          rS := s;
          while not HasTerminated do
            if rS <> S then begin
              rS := S;
              CurrentC := TCursiveNumbers.ToCurrency(rS);
              Assert.AreEqual(LastReadC + IncBy, CurrentC, 'Oops');
              LastReadC := CurrentC;
            end;
        end).Start;
    
      for i := 0 to Iterations do begin
        c := c + IncBy;
        s := TCursiveNumbers.ToText(c);
        Sleep(1); // give the slice away
      end;
    
      HasTerminated := True;
      Sleep(2);
      Assert.AreEqual(c, LastReadC, 'Reading does not match writing');
      Log(S);
    end;
    
    
    end.

     

     


  3. 7 hours ago, dummzeuch said:

    What about a packed record

    OK, simple variables and lets add default aligned, but that was not the question.
     

    As you can see with the TSrwLock declaration, the FIRST variable in a record is always properly aligned.

     

    I use this during initialization:

    //MMWIN:MEMBERSCOPY
    unit _MM_Copy_Buffer_;
    
    interface
    
    type
      TAtomic = record
         /// <summary>
         ///   Assures {$A8} or {$A+} state
         /// </summary>
         /// <seealso href="https://stackoverflow.com/questions/829235/ifopt-a4">
         ///   {$IFOPT A4}?
         /// </seealso>
        class constructor Create;
      end;
    
    
    implementation
    
     { TAtomic }
    
    class constructor TAtomic.Create;
    type
      TTestRec = record
        A: Byte;
        B: Int64;
      end;
    begin
      // In the {$A8} or {$A+} state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on quadword boundaries.
    {$IF SIZEOF(TTestRec) <> 16}
      'App must be compiled in A8 mode'
    {$IFEND}
    end;
    
    
    end.

     


  4. 1 minute ago, Uwe Raabe said:

    Perhaps the ISO installer requires

    I checked for installation instructions and found none, attempted an install and failed.

    Enough new EMB tech for now.. 🙂

     

    BTW: Its difficult to compare previous installers since they change (and fail) frequently but in the last few ISO versions it prompted for an uninstall before installing.

     

    Will see how that goes on my laptop later, its setup using 'Web Installer'..

     

    • Sad 1

  5. 12 hours ago, Dave Nottage said:

    A required privilege is not held by the client

     

    I was using Berlin elevated when I ran that and get the same error msg while running non elevated.

     

    My own wrapper around AdjustTokenPrivileges works because it checks the last error after that call regardless of the number of privileges adjusted.

    In your demo (GetLastError=1300) while running non elevated.

     

    This code behaves correctly:

          // Enable or disable the privilege
          Result := AdjustTokenPrivileges(LToken, False, LTokenPriv, SizeOf(LPrevTokenPriv), LPrevTokenPriv, LLength);
          Result := Result and (GetLastError = ERROR_SUCCESS);

     


  6. 56 minutes ago, Dave Nottage said:

    "Could not save"

     

    Works in Berlin when I change output to an existing folder: 'd:\Notepad.dat'

     

    Plus this addition gives me the dialog below if I try to save into a dir which does not exist:

     ShowMessage('Could not save: ' + LReg.LastErrorMsg);

    [Window Title]
    Project1

    [Content]
    Could not save: The system cannot find the path specified

    [OK]


  7. Just now, dummzeuch said:

    Also, it can be configured to allow up to 30 days

    Just read that on your site, sounds like a great option.

     

    As for hardware; Uwe supplied the link, a full Linux version is required (no router).
    I have that running but I'm thinking about hardware failure and in that case running a license server on the same machine(s) isn't optimal.

    I do have an Ubuntu Azure VM running and that may be the best way to do this..


  8. 1 minute ago, dummzeuch said:

    Convert your license to a network named user license

    I'm going to assume there are no Docker images nor light weight installs (for a Router) of this?

     

    This does seem to be an important change to consider, unless one believes in a flawless self updating registration system being right around the corner..

     

    • Like 1
×