Подтвердить что ты не робот

Потоки Delphi 2010

Может ли кто-нибудь опубликовать простейший пример потока для Delphi 2010, который, например, помещает некоторый текст в заметку при нажатии кнопки? С внедрением и всем. Спасибо.

Обновление: Хорошо, просто простой поток, который что-то делает. Нет необходимости в памятке. Спасибо.

4b9b3361

Ответ 1

Там есть хорошая демонстрация потока, включая GUI/Synchronize, которая поставляется с Delphi. В D2005 он находится в: C:\Program Files\Borland\BDS\3.0\Demos\DelphiWin32\VCLWin32\Threads

Ответ 2

Простейший пример, который я могу себе представить: (Предположим, у вас есть Memo1 в Form1)

procedure TForm1.Button1Click(Sender: TObject); 
begin   
  TThread.CreateAnonymousThread(procedure
      var
        slThread: TStringList;
        i: Integer;
        begin
          //do something in thread
          slThread := TStringList.Create;
          try
            for i := 0 to 100 - 1 do
            begin
              slThread.Add(Format('Value %D',[i]));
            end;

            //update gui
            TThread.Synchronize(nil, procedure
            begin
              Form1.Memo1.Lines.AddStrings(slThread);
            end);


          finally
            slThread.Free;
          end;


        end).Start;
end;

Хотя я не буду рекомендовать его использовать, потому что у него есть некоторые недостатки. Лучше спуститься со своего собственного класса TThread, но для вашего вопроса этот пример хорошо подходит.

Ответ 3

Как уже отмечалось, создание потока для обновления GUI не является хорошим дизайном. Было бы лучше, если бы ваши потоки выполняли какую-то фактическую работу и позволяли основному потоку обновлять ваш дисплей.

В то время как Delphi также предлагает класс TThread, чтобы упростить создание/управление потоками, вы также можете взглянуть на использование Delphi BeginThread функция для выполнения простых потоков. Существует пример на веб-сайте Delphi Basics, который я воспроизвел здесь:

// Full Unit code.
// -----------------------------------------------------------
// You must store this code in a unit called Unit1 with a form
// called Form1 that has an OnCreate event called FormCreate.

unit Unit1;

interface

uses
  Forms, Dialogs, Windows, SysUtils;

type
  TMsgRecord = record
    thread : Integer;
    msg    : string[30];
  end;
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

Implementation
{$R *.dfm}        // Include form definitions

ThreadVar         // We must allow each thread its own instances
                  // of the passed record variable
  msgPtr : ^TMsgRecord;

// Private thread procedure to show a string
function ShowMsg(Parameter : Pointer) : Integer;
begin
  // Set up a 0 return value
  Result := 0;

  // Map the pointer to the passed data
  // Note that each thread has a separate copy of msgPtr
  msgPtr := Parameter;

  // Display this message
  ShowMessagePos('Thread '+IntToStr(msgPtr.thread)+' '+msgPtr.msg,
                 200*msgPtr.thread, 100);

  // End the thread
  EndThread(0);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  id1, id2 : LongWord;
  thread1, thread2 : Integer;
  msg1, msg2 : TMsgRecord;

begin
  // set up our display messages
  msg1.thread := 1;
  msg1.msg    := 'Hello World';
  msg2.thread := 2;
  msg2.msg    := 'Goodbye World';

  // Start the first thread running asking for users first name
  thread1 := BeginThread(nil,
                         0,
                         Addr(ShowMsg),
                         Addr(msg1),
                         0,
                         id1);

  // And also ask for the surname
  thread2 := BeginThread(nil,
                         0,
                         Addr(ShowMsg),
                         Addr(msg2),
                         0,
                         id2);

  // Ensure that the threads are only closed when all done
  ShowMessagePos('Press this when other dialogs finished.', 200, 300);

  // Finally, tidy up by closing the threads
  CloseHandle(thread1);
  CloseHandle(thread2);
end;

end.

Здесь также еще один пример о том, как использовать потоки с параметрами (используя BeginThread).