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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.021 c
2-1199385590
Stepper
2008-01-03 21:39
2008.02.03
Shape.Brush.Color... + Timer


1-1193671998
avoid
2007-10-29 18:33
2008.02.03
Как узнать, по какой колонке был клик в TListView?


2-1200054973
9899100
2008-01-11 15:36
2008.02.03
MDIchild отобразить модально


15-1198493979
Skier
2007-12-24 13:59
2008.02.03
Посоветуйте видеокамеру...


15-1198857366
Alkid
2007-12-28 18:56
2008.02.03
Multiple dispatch