Форум: "Основная";
Текущий архив: 2002.11.14;
Скачать: [xml.tar.bz2];
Вниз
Как сделать многопоточное прил. добавления ~миллиона букв в Memo? Найти похожие ветки
← →
stilet (2002-11-04 08:57) [0]Как сделать многопоточное прил. добавления ~миллиона букв в Memo?
Знатоки, подскажите как пример, я не могу просечь это, вчера целый день сидел. Вот код, типа что я хочу сделать, тут видно, но сейчас это вешает (она не реагирует) форму при запуске. Больше наворотов никаких не надо, лишь бы разобраться, может единственное, добавить третью кнопку - ПАУЗА. Сейчас две, Старт, Стоп (стоп тоже не работает пока) и одно Memo., Заранее спасибо.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;
var
Form1: TForm1;
implementation
procedure TMyThread.Execute;
begin
Synchronize(DoWork);
end;
procedure TMyThread.DoWork;
var
i:integer;
begin
i:=0;
repeat
begin
i:=i+1;
Form1.Memo1.Lines.Add(IntToStr(i)+" - "+IntToStr(Random(500000)));
end;
until Terminated;
end;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(False);
end;
end.
← →
Smithson (2002-11-04 09:27) [1]
procedure TMyThread.Execute;
begin
Synchronize(DoWork);
end;
procedure TMyThread.DoWork;
var
i:integer;
begin
i:=0;
repeat
begin
i:=i+1;
Form1.Memo1.Lines.Add(IntToStr(i)+" - "+IntToStr(Random(500000)));
end;
until Terminated;
end;
С таким кодом нет смысла городить поток. Функция Synchronize выполняется в контексте основного потока (потока VCL)? так что с тем же успехом ты мог ее вызвать сразу из обработчика кнопки.
Надо примерно так:
TMyThread = class(Thread)
iCounter: Integer;
...
end;
...
procedure TMyThread.Execute;
var
i:integer;
begin
i:=0;
repeat
begin
i:=i+1;
iCounter := I;
Synchronize(DoWork);
end;
until Terminated;
end;
procedure TMyThread.DoWork;
begin
Form1.Memo1.Lines.Add(IntToStr(iCounter)+" - "+IntToStr(Random(500000)));
end;
Так у тебя будут продыхи в программе и форма "висеть" не будет
← →
cpp (2002-11-04 12:00) [2]Самый простой способ и наиболее быстрый это сохранить буквы сначала в TStringList,
а потом только через memo.Lines.AddStrings(твой TStringList) добавить в Memo
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.14;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c