Текущий архив: 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.5 MB
Время: 0.039 c