Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.14;
Скачать: CL | DM;

Вниз

Как сделать многопоточное прил. добавления ~миллиона букв в 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.017 c
1-45896
atmospheric
2002-11-05 22:42
2002.11.14
UpCase не работает с русскими буквами !!


1-45836
Андрусь
2002-11-04 19:23
2002.11.14
Как создать форму с помощью API функций


14-46051
Kotka
2002-10-25 23:19
2002.11.14
Heeeeeeeeelp!


3-45735
ilya1974
2002-10-22 16:48
2002.11.14
Представление данных


7-46152
Comwad
2002-09-06 13:16
2002.11.14
Как сделать точную временную задержку менее 55 миллисекунд?