Can anyone explain why this program doesn’t capture the state of the local 
variable “I” and execute in order? It will return something like this:

Invoked: 3 id: 00000001029D41C0
Invoked: 0 id: 00000001029D42C0
Invoked: 0 id: 00000001029D44C0
Invoked: 0 id: 00000001029D43C0

It works if you call Start directly before WaitFor, but why? I would expect the 
function reference to capture i, start the thread and then block the program 
after the sleep calls but instead the sleep calls appear to do nothing and the 
program exists immediately.

=================================

{$mode objfpc}
{$modeswitch anonymousfunctions}
{$modeswitch functionreferences}
{$modeswitch arrayoperators}

program test;
uses
  Cthreads, SysUtils, Classes;

type
  TProc = reference to procedure;
  TCallback = class(TThread)
    private
      proc: TProc;
    public
      constructor Create(p: TProc);
      procedure Execute; override;
end;

procedure TCallback.Execute;
begin
  proc();
  Sleep(100);
end;

constructor TCallback.Create(p: TProc);
begin
  inherited Create(true);

  proc := p;
end;

var
  i: integer;
  callback: TCallback;
  callbacks: array of TCallback = ();
begin
  for i := 1 to 4 do
    begin
      callback := TCallback.Create(procedure
                  begin
                    writeln('Invoked: ', i, ' id: ', 
HexStr(TThread.CurrentThread));
                  end);

      callback.Start;
      callbacks += [callback];
    end;

  for i := 0 to High(callbacks) do
    callbacks[i].WaitFor;
end.

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to