![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
я вот че-то не могу понять потоки:(
No_Dead © (2008-01-11 07:52:00)вроде все правильно делаю, ан нет:( пока процедура не выполнится не получается нажать на форме.
вот что «нахимичил»
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.
где я делаю не так?
Malik (2008-01-13 02:44:00) [1]Молодец, что затронул эту тему давно намеровался я написать многопоточное приложение для вычисления Пи разными способами, только забывал про это когда было свободное время...
MetalFan (2008-01-12 23:54:00) [2]рисуй сразу на HDC из потока, только в нем ее и получай...
тогда будет смысл в этой затее.
з.ы. я так делал "замусоровщик" экрана.... т.е. из доп.потока рисовал сразу в GetDC(0)
MsGuns (2008-01-12 23:18:00) [3]Сабж - мрак.
Прежде чем писАть неплохо бы почитать что-то о потоках, например Тэксейру
Сергей М. (2008-01-12 18:09:00) [4]
> No_Dead
Использование дополнительных кодовых потоков оправдано в случаях, когда необходимо реализовать независимое параллельное исполнение участков кодов, реализующих времяемкие (и/или критичные ко времени исполнения) алгоритмы.
Zeqfreed (2008-01-12 12:12:00) [5]> No_Dead © (12.01.08 08:12) [15]
Нет не использую :) Потому что действительно нужны они крайне редко.
No_Dead (2008-01-12 08:12:00) [6]> [14] Zeqfreed © (12.01.08 08:04)
скажи, ты используешь потоки?
в каких случаях?
для чего такого глобального?
Zeqfreed (2008-01-12 08:04:00) [7]> No_Dead © (12.01.08 02:51) [13]
Потоки опять же не нужны. Конечно, присобачить их куда угодно можно, но только демонстрацией удачной это не будет.
clickmaker уже подсказал тебе как лучше поступить в данной ситуации. И целесообразно это будет со всех точек зрения.
No_Dead (2008-01-12 02:51:00) [8]
> [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)
это целесообразнее будет? с точки зрения удобства для программиста, или с точки зрения пользователя? или всем хорошо бут?
clickmaker (2008-01-11 13:56:00) [9]
> мне надо просто «войнушку» смоделировать. а что бы действия
> происходили «одновременно» решил потоки юзать
Timer, список объектов (в TList, к примеру), каждый из которых имеет свою траекторию движения (задачу).
В OnTimer последовательно изменяй координаты и, если надо, состояние объектов. При малом интервале будет достаточно быстро
Еще рекомендую включить DoubleBuffered, чтоб не мелькало
Zeqfreed (2008-01-11 13:51:00) [10]Потоки нужны для «параллельного» исполнения двух участков кода. Если задача в принципе не подразумевает параллельного исполнения чего-либо, то как можно реализовать это хоть в учебных целях, хоть как?
Сергей М. (2008-01-11 11:52:00) [11]
procedure TCountObj.Execute;
begin
Synchronize(UpdateCanvas);
if terminated then exit; <-- А это, похоже, уже собственный алгоритмический шедевр)
end;
Anatoly Podgoretsky (2008-01-11 11:48:00) [12]> No_Dead (11.01.2008 07:52:00) [0]
Верный последователь Архангельского
procedure TCountObj.Execute;
begin
Synchronize(UpdateCanvas); <--
if terminated then exit;
end;
Рамиль (2008-01-11 09:45:00) [13]
> просто написал UpdateCanvas. и все то что надо
С большой долей вероятности получишь через некоторое время ошибку "Canvas cannot allow drawing".
Оставь как было и вставь дополнительно Sleep.
А еще лучше рисуй по таймеру, в данном случае поток лишний.
Сергей М. (2008-01-11 09:32:00) [14]
> вместо Synchronize(UpdateCanvas); просто написал UpdateCanvas
Нельзя так делать.
Обращения к визуальным VCL-контролам в доп.потоках ведут к непредсказуемым последствиям.
No_Dead (2008-01-11 09:28:00) [15]> [5] sniknik © (11.01.08 09:01)
да, смотрел я сначала там. надо азы:)
> [4] Сергей М. © (11.01.08 08:28)
вместо Synchronize(UpdateCanvas); просто написал UpdateCanvas. и все то что надо (?). рисунок движется, по другим кнопкам могу нажимать во время движения.
трабла была видимо(ну насколько я понял) в том что Synchronize все «замораживает» кроме вызываемой процедуры.
sniknik (2008-01-11 09:01:00) [16]
C:\Program Files\Borland\Delphi7\Demos\Threads
Сергей М. (2008-01-11 08:28:00) [17]
> пытаюсь разобраться как оно и что оно
Похвально.
Начни "разборки" с изучения метода Synchronize() - зачем он нужен, как работает, в каких случаях его следет применять, а в каких избегать его применения.
No_Dead (2008-01-11 08:15:00) [18]> А собссно зачем он ?
ну так это тестовая версия. пытаюсь разобраться как оно и что оно:)
мне надо просто «войнушку» смоделировать. а что бы действия происходили «одновременно» решил потоки юзать.
иль ты не о том?
Сергей М. (2008-01-11 08:12:00) [19]
> а вот и поток
А собссно зачем он ?
Dib@zol (2008-01-11 08:00:00) [20]Наиболее простой способ - добавить Application.ProcessMessages. Однако не советую так делать, ибо так можно отгрести нехилых глюков.