Главная страница
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.021 c
1-45875
Strumpf
2002-11-04 22:05
2002.11.14
Эмуляция фокуса на внутренней форме


14-46061
AL2002
2002-10-22 18:23
2002.11.14
Где можно скачать шахматы?


1-45859
Ali2002
2002-11-05 13:17
2002.11.14
Фамилии из именительного в дательный падеж


8-46014
ctapik-net
2002-07-24 22:36
2002.11.14
Надпись на картинке


14-46065
lensky
2002-10-24 18:28
2002.11.14
tovarnie znaki i logo, plz help