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

Вниз

Проблемы с 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.033 c
6-1533
nester
2003-06-25 18:16
2003.09.01
как перехватить в IE 404 not found и подсунуть вместо этого свое


1-1396
Zorik
2003-08-19 16:11
2003.09.01
как подключить dllки с произвольной папки


3-1273
dimm
2003-08-11 17:22
2003.09.01
DBLookupCombobox не открывается полностью. Т.е. хочу видеть все


1-1473
LuLu
2003-08-18 14:04
2003.09.01
изменение формы


14-1551
Артем К
2003-08-12 04:18
2003.09.01
Уважаемые Мастера, подскажите хороший ресурс по Visual C++