How to manage the return value of a thread?

后端 未结 5 1699
逝去的感伤
逝去的感伤 2020-12-28 20:22

I created a class derived from TThread that executes in background a query.

I want that this class is decoupled from the client.

This kind of th

5条回答
  •  隐瞒了意图╮
    2020-12-28 21:18

    Create a form and add a ListBox , two Buttons, and edit your form. Then use this code:

    unit Unit1;
    
        interface
    
        uses
          Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
          Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    
        type
          TSyncMethod = procedure(ReturnValue: integer) of object;
          TMyThread = class(TThread)
           private
              fLowerLimit: Integer;
              fUpperLimit: Integer;
              FMethod: TSyncMethod;
              FMethodValue: Integer;
              procedure UpdateMainThread;
           protected
              procedure Execute; override;
           public
              constructor Create(AMethod: TSyncMethod;lValue, uValue: Integer; Suspended: Boolean);
           end;
    
    
    
          TForm1 = class(TForm)
            Button1: TButton;
            Edit1: TEdit;
            Button2: TButton;
            ListBox1: TListBox;
            procedure Button2Click(Sender: TObject);
            procedure Button1Click(Sender: TObject);
          private
             MyMethod: TSyncMethod;
             ReturnValue : Integer;
             CountingThread: TMyThread;
             procedure MyTest(X : Integer);
            { Private declarations }
          public
            { Public declarations }
          end;
    
        var
          Form1: TForm1;
    
        implementation
    
        {$R *.dfm}
    
        constructor TMyThread.Create(AMethod: TSyncMethod;lValue, uValue: Integer; Suspended: Boolean);
        begin
           FMethod := AMethod;
           Inherited Create(Suspended);
           fLowerLimit := lValue;
           fUpperLimit := uValue;
           FreeOnTerminate := True;
           Priority := tpLowest;
        end;
    
        procedure TMyThread.Execute;
        var
           I: Integer;
        begin
    
           For I := fLowerLimit to fUpperLimit do
              if (I mod 10) = 0 then
                 Synchronize(UpdateMainThread);
    
          FMethod(FMethodValue);
        end;
    
        procedure TMyThread.UpdateMainThread;
        begin
           Form1.ListBox1.Items.Add('Hello World');
           FMethodValue :=  Form1.ListBox1.Count;
        end;
    
        procedure TForm1.Button1Click(Sender: TObject);
        begin
           MyMethod := MyTest;
           CountingThread := TMyThread.Create(MyMethod,22, 999, True);
           CountingThread.Resume;
        //   ShowMessage(IntToStr(ReturnValue));
        end;
    
        procedure TForm1.Button2Click(Sender: TObject);
        begin
          ShowMessage(Edit1.Text);
        end;
    
        procedure TForm1.MyTest(X: Integer);
        begin
          ShowMessage(IntToStr(X));
        end;
    
        end.        
    

提交回复
热议问题