Ответ 1
Там есть хорошая демонстрация потока, включая GUI/Synchronize, которая поставляется с Delphi. В D2005 он находится в: C:\Program Files\Borland\BDS\3.0\Demos\DelphiWin32\VCLWin32\Threads
Может ли кто-нибудь опубликовать простейший пример потока для Delphi 2010, который, например, помещает некоторый текст в заметку при нажатии кнопки? С внедрением и всем. Спасибо.
Обновление: Хорошо, просто простой поток, который что-то делает. Нет необходимости в памятке. Спасибо.
Там есть хорошая демонстрация потока, включая GUI/Synchronize, которая поставляется с Delphi. В D2005 он находится в: C:\Program Files\Borland\BDS\3.0\Demos\DelphiWin32\VCLWin32\Threads
Простейший пример, который я могу себе представить: (Предположим, у вас есть 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, но для вашего вопроса этот пример хорошо подходит.
Как уже отмечалось, создание потока для обновления 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).
Лучший источник общей информации о потоке в Delphi, bar none, можно найти здесь - http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/ToC.html. Взгляните сюда, прежде чем отправиться куда-нибудь еще.