Главная страница
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.018 c
1-45979
AlexanderSK
2002-11-04 17:37
2002.11.14
Выгрузка DLL


1-45928
Кен
2002-11-01 07:58
2002.11.14
А нет ли какой нибудь программы для перевода паскаля в ассемблер?


3-45716
kucherav
2002-10-24 12:39
2002.11.14
Help Чайнику!!!


1-45962
Axill
2002-11-02 15:09
2002.11.14
Как преобразовать десятичные в двоичные и наоборот


1-45844
Azazello
2002-11-05 12:48
2002.11.14
TListBox