Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Вниз

я вот че-то не могу понять потоки:(   Найти похожие ветки 

 
No_Dead ©   (2008-01-11 07:52) [0]

вроде все правильно делаю, ан нет:( пока процедура не выполнится не получается нажать на форме.
вот что «нахимичил»

unit Unit1;

interface

uses MyT;

type
 Tform1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure raketa(x,y:integer);
 private
   co:TCountObj;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 form1: Tform1;

implementation

{$R *.dfm}

procedure Tform1.Button1Click(Sender: TObject);
begin
co:=TCountObj.Create(true);
co.Resume;
co.Priority:=tpLower;
end;

procedure tform1.raketa(x,y:integer);
begin
begin
form1.Canvas.Rectangle(x,y,x+10,y+40);
form1.Canvas.Pen.Color:=clred;
form1.canvas.MoveTo(x,y);
form1.canvas.LineTo(x+5,y-8);

form1.canvas.MoveTo(x+5,y-8);
form1.canvas.LineTo(x+10,y);

form1.canvas.MoveTo(x,y+30);
form1.canvas.LineTo(x-5,y+40);

form1.canvas.MoveTo(x-5,y+40);
form1.canvas.LineTo(x+15,y+40);

form1.canvas.MoveTo(x+15,y+40);
form1.canvas.LineTo(x+10,y+30);

form1.Canvas.Ellipse(x,y,x+10,y+10);
end;
end;

procedure Tform1.Button2Click(Sender: TObject);
begin
co.Terminate;
end;

end.


а вот и поток
unit MyT;
interface
uses
 Classes, Sysutils,Messages,Windows,Graphics;
type
 TCountObj = class(TThread)
 private
       procedure Updatecanvas;
   { Private declarations }
 protected
   procedure Execute; override;

 end;

implementation
  uses unit1;

procedure TCountObj.Execute;
begin
  Synchronize(UpdateCanvas);
  if terminated then exit;
 end;
procedure TCountObj.Updatecanvas;
var
i:integer;
begin
for i:=1 to 100 do
begin
sleep(10);
form1.Canvas.FillRect(form1.Canvas.ClipRect);
form1.raketa(i,200);
end;
end;end.


где я делаю не так?


 
Dib@zol ©   (2008-01-11 08:00) [1]

Наиболее простой способ - добавить Application.ProcessMessages. Однако не советую так делать, ибо так можно отгрести нехилых глюков.


 
Сергей М. ©   (2008-01-11 08:12) [2]


> а вот и поток


А собссно зачем он ?


 
No_Dead ©   (2008-01-11 08:15) [3]

> А собссно зачем он ?

ну так это тестовая версия. пытаюсь разобраться как оно и что оно:)

мне надо просто «войнушку» смоделировать. а что бы действия происходили «одновременно» решил потоки юзать.

иль ты не о том?


 
Сергей М. ©   (2008-01-11 08:28) [4]


> пытаюсь разобраться как оно и что оно


Похвально.
Начни "разборки" с изучения метода Synchronize() - зачем он нужен, как работает, в каких случаях его следет применять, а в каких избегать его применения.


 
sniknik ©   (2008-01-11 09:01) [5]

C:\Program Files\Borland\Delphi7\Demos\Threads


 
No_Dead ©   (2008-01-11 09:28) [6]

> [5] sniknik ©   (11.01.08 09:01)

да, смотрел я сначала там. надо азы:)


> [4] Сергей М. ©   (11.01.08 08:28)

вместо Synchronize(UpdateCanvas); просто написал UpdateCanvas. и все то что надо (?). рисунок движется, по другим кнопкам могу нажимать во время движения.
трабла была видимо(ну насколько я понял) в том что Synchronize все «замораживает» кроме вызываемой процедуры.


 
Сергей М. ©   (2008-01-11 09:32) [7]


> вместо Synchronize(UpdateCanvas); просто написал UpdateCanvas


Нельзя так делать.
Обращения к визуальным VCL-контролам в доп.потоках ведут к непредсказуемым последствиям.


 
Рамиль ©   (2008-01-11 09:45) [8]


> просто написал UpdateCanvas. и все то что надо

С большой долей вероятности получишь через некоторое время ошибку "Canvas cannot allow drawing".
Оставь как было и вставь дополнительно Sleep.

А еще лучше рисуй по таймеру, в данном случае поток лишний.


 
Anatoly Podgoretsky ©   (2008-01-11 11:48) [9]

> No_Dead  (11.01.2008 07:52:00)  [0]

Верный последователь Архангельского


procedure TCountObj.Execute;
begin
 Synchronize(UpdateCanvas);  <--
 if terminated then exit;
end;


 
Сергей М. ©   (2008-01-11 11:52) [10]

procedure TCountObj.Execute;
begin
Synchronize(UpdateCanvas);  
if terminated then exit; <-- А это, похоже, уже собственный алгоритмический шедевр)
end;


 
Zeqfreed ©   (2008-01-11 13:51) [11]

Потоки нужны для «параллельного» исполнения двух участков кода. Если задача в принципе не подразумевает параллельного исполнения чего-либо, то как можно реализовать это хоть в учебных целях, хоть как?


 
clickmaker ©   (2008-01-11 13:56) [12]


> мне надо просто «войнушку» смоделировать. а что бы действия
> происходили «одновременно» решил потоки юзать

Timer, список объектов (в TList, к примеру), каждый из которых имеет свою траекторию движения (задачу).
В OnTimer последовательно изменяй координаты и, если надо, состояние объектов. При малом интервале будет достаточно быстро
Еще рекомендую включить DoubleBuffered, чтоб не мелькало


 
No_Dead ©   (2008-01-12 02:51) [13]


> [8] Рамиль ©   (11.01.08 09:45)

угу)) уже познакомился сей эркой:)


> [9] Anatoly Podgoretsky ©   (11.01.08 11:48)
> [10] Сергей М. ©   (11.01.08 11:52)

ай-я-я-й))) Фленов:) первое что под руку попало:)

> [11] Zeqfreed ©   (11.01.08 13:51)

ну, вот смотри. такая задачка. (первое что в голову пришло): вывод координат двигающейся точки по форме. можно здесь из потоков обойтись, а можно и с потоками, для демонстрации. или я не прав?


> [12] clickmaker ©   (11.01.08 13:56)

это целесообразнее будет? с точки зрения удобства для программиста, или с точки зрения пользователя? или всем хорошо бут?


 
Zeqfreed ©   (2008-01-12 08:04) [14]

> No_Dead ©   (12.01.08 02:51) [13]

Потоки опять же не нужны. Конечно, присобачить их куда угодно можно, но только демонстрацией удачной это не будет.

clickmaker уже подсказал тебе как лучше поступить в данной ситуации. И целесообразно это будет со всех точек зрения.


 
No_Dead ©   (2008-01-12 08:12) [15]

> [14] Zeqfreed ©   (12.01.08 08:04)

скажи, ты используешь потоки?
в каких случаях?
для чего такого глобального?


 
Zeqfreed ©   (2008-01-12 12:12) [16]

> No_Dead ©   (12.01.08 08:12) [15]

Нет не использую :) Потому что действительно нужны они крайне редко.


 
Сергей М. ©   (2008-01-12 18:09) [17]


> No_Dead


Использование дополнительных кодовых потоков оправдано в случаях, когда необходимо реализовать независимое параллельное исполнение участков кодов, реализующих времяемкие (и/или критичные ко времени исполнения) алгоритмы.


 
MsGuns ©   (2008-01-12 23:18) [18]

Сабж - мрак.
Прежде чем писАть неплохо бы почитать что-то о потоках, например Тэксейру


 
MetalFan ©   (2008-01-12 23:54) [19]

рисуй сразу на HDC из потока, только в нем ее и получай...
тогда будет смысл в этой затее.
з.ы. я так делал "замусоровщик" экрана.... т.е. из доп.потока рисовал сразу в GetDC(0)


 
Malik   (2008-01-13 02:44) [20]

Молодец, что затронул эту тему давно намеровался я написать многопоточное приложение для вычисления Пи разными способами, только забывал про это когда было свободное время...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.043 c
9-1166529720
Kav
2006-12-19 15:02
2008.02.03
загрузчик obj


2-1199617359
WebSQLNeederr
2008-01-06 14:02
2008.02.03
Как загрузить изображение в TPaintBox


15-1198321867
Kostafey
2007-12-22 14:11
2008.02.03
С днем рождения ! 22 декабря


15-1199134826
Ega23
2008-01-01 00:00
2008.02.03
С Новым Годом!!!!


15-1198607831
vrem_
2007-12-25 21:37
2008.02.03
Что планируете на следующий год?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский