Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
1-1487
saha
2003-08-19 17:23
2003.09.01
Registry


14-1556
Marser
2003-08-12 00:45
2003.09.01
Именинники 12 августа


4-1736
jonni
2003-07-03 02:43
2003.09.01
DEFINE_GUID и с чем его едят???


1-1481
revo
2003-08-18 12:48
2003.09.01
Как узнать занят ли файл другим приложением?


6-1528
oduvan
2003-06-22 17:47
2003.09.01
Как написать прокси сервер?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский