Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
ВнизПроблемы с TThread... Найти похожие ветки
← →
ZDima (2003-08-16 14:35) [0]Господа, помогите разобраться с нитями(TThread) - я начал изучать их вчера и наклепал такую программу:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, StdCtrls;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
t:TMyThread;
implementation
{$R *.dfm}
procedure TMyThread.Execute;
begin
Synchronize(DoWork);//<--когда пишу Synchronize
//форма не обрабатывает события
//DoWork; //<--когда не пишу
//выскакивает ошибка
//"Out of system resources"
//Что делать??? :(((
t.FreeOnTerminate:=true;
t.Free;
end;
procedure TMyThread.DoWork;
var i:integer; b:TBitmap;
j:TJPEGImage;
begin
//------Save------------
CreateDir("c:\zdima\");
b:=TBitmap.Create;
j:=TJPEGImage.Create;
b.Width:=200; //тут пиши любые числа
b.Height:=200;//в зависемости от быстродействия компа
for i:=1 to 101 do begin
b.Canvas.Pen.Color:=random($FFFFFF);
b.Canvas.MoveTo(random(200),random(200));
b.Canvas.LineTo(random(200),random(200));
j.Assign(b);
j.Compress;
j.SaveToFile("c:\zdima\"+inttostr(i)+".jpg");
end;
b.Free;
j.Free;
Form1.Caption:="Done";
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
t:=TMyThread.Create(false);
end;
end.
Как видите всё предельно просто, но вот кода пишешь Synchronize(DoWork);(см. код) приложение не обрабатывает сообщения- только после выполнения кода в TMyThread.DoWork; а если написать просто
DoWork; появляется ошибка "Out of system resources"...
Подскажите, что я не так делаю... Вобщем как сделать, чтобы работало???
P.S. ответ лучше в виде кода...
← →
Романов Р.В. (2003-08-16 14:43) [1]Неудачный пример для изучения потоков.
Synchronize(DoWork) выполняется в контесте основного потока и соответственно все другие процедуры основного потока "отдыхают", в том числе и обработчики сообщений.
Если вызыаешь просто DoWork, убери Form1.Caption:="Done" или помести его в отдельную процедуру которую вызывай через Synchronize
← →
¤ZDima¤ (2003-08-16 15:15) [2]Спасибо
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.04 c