Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.013 c
3-45777
Zloy
2002-10-22 04:14
2002.11.14
Приветствую!!! Не посоветуете, плиз, как базу парадокс сохранить


14-46119
IronHawk
2002-10-20 12:04
2002.11.14
Киевская встреча Мастаков СОСТОЯЛАСЬ!


1-45804
Cobalt
2002-11-04 22:40
2002.11.14
Размеры ListBox


14-46150
Nico1a
2002-10-28 17:44
2002.11.14
DLL


6-46023
snowman
2002-09-13 16:02
2002.11.14
Как узнать имя под которым расшарена директория?




   Наверх