![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки и процедуры...
maxistent © (2008-01-09 23:15:00)Всем доброго времени. Прошу помочь вот с чем. Мне нужно создать некий объект, в котором будут приватные и общедоступные процедуры и переменные. Так вот. При вызове одной из процедур, она (процедура) должна выполнить некоторые действия и создать отдельный поток для обработки этих "действий", передав ему на "рассмотрение" некоторые переменные. Тот самый поток после длительного процесса обработки должен передать результаты другой процедуре (так же, в виде переменных). У меня почти всё получилось, кроме последнего. Вот, код приблизительно такого плана:
unit mytest1;
interface
uses
Windows;
type
TMyObject=object
private
{переменные}
Procedure Proc1(param:integer);
Procedure Proc2(param1,param2:integer);
public
{переменные}
Procedure MainProc;
end;
implementation
var
{переменные}
Procedure TMyObject.MainProc;
Procedure MyThread(param:Pointer);
var
{переменные}
begin
...долго что-то делаем...
Proc1(параметр);
end;
var
p:Pointer;
begin
...что-то делаем...
BeginThread(nil,0,@DoListen,p,0,id1);
end;
Procedure TMyObject.Proc1(param:integer);
begin
ВОТ ТУТ ПРОБЛЕМЫ!!! Процедура должна изменить значения переменных объекта (предположим, приватных) и вызвать Proc2. Но она обращается не к "своим переменным", а вообще не понятно куда... и прога "вылетает"...
end;
Procedure TMyObject.Proc2(param:integer);
begin
...что-то делаем...
end;
end.
...специально сократил, чтобы не утомлять читателя и не занимать много места.
Вот. Как мне быть в этой ситуации? Как сделать, чтобы всё находилось и выполнялось в пределах ОДНОГО объекта?
Сергей М. (2008-01-10 11:39:00) [1]
> oxffff © (10.01.08 10:35) [17]
> CreateThread
Провоцируешь Автора на потенциальные грабли.
maxistent (2008-01-10 11:01:00) [2]
> Сергей М. © (10.01.08 09:48) [16]
Точно! почему я сам не "допёр"?.. стареем :-( ВСЕМ СПАСИБО!!! ВСЁ, ЗАРАБОТАЛО! :-D
FreeMem(maxistent);
oxffff (2008-01-10 10:35:00) [3]
> maxistent © (10.01.08 01:07) [10]
XSampleThread=class
protected
procedure ThreadMethod;stdcall;
public
procedure Run;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
IsMultiThread:=TRUE;
with XSampleThread.create do run;
end;
{ XSampleThread }
procedure XSampleThread.Run;
var tid:DWORD;
begin
CreateThread(nil,0,@XSampleThread.ThreadMethod,self,0,Tid);
end;
procedure SyncMethod(obj:XSampleThread);
begin
showmessage('OK DOKI '+obj.ClassName);
end;
procedure XSampleThread.ThreadMethod;
var ThreadMethod:TThreadMethod;
begin
Tmethod(ThreadMethod).Code:=@SyncMethod;
Tmethod(ThreadMethod).Data:=self;
Repeat
TThread.Synchronize(nil,ThreadMethod);
Sleep(2000);
until FALSE;
end;
Сергей М. (2008-01-10 09:48:00) [4]
> maxistent © (10.01.08 09:43) [15]
Что значит "из самого объекта" ?
В теле его метода что ли ?
Тогда Self.
maxistent (2008-01-10 09:43:00) [5]только вот не пойму, КАК УЗНАТЬ адрес объекта из самого объекта?
maxistent (2008-01-10 09:40:00) [6]О, это уже интереснее! А я как-то сразу и не подумал... :-) пасиб, попробую...
maxistent (2008-01-10 09:39:00) [7]О, это уже интереснее! :-) пасиб, попробую...
Slym (2008-01-10 06:07:00) [8]maxistent © (10.01.08 1:07) [10]
тогда либо передвавай нужный объект в MyThread( OBJ:Pointer);
Юрий Зотов (2008-01-10 01:12:00) [9]> maxistent © (10.01.08 01:07) [10]
Тогда передавайте в поточную функцию адрес своего объекта, а в ней приводите тип и юзайте его на здоровье. Но не забудьте, что когда программист сам скрещивает ежа с ужом, то и за последствия он отвечает тоже сам (это к вопросу о потокобезопасном коде).
maxistent (2008-01-10 01:07:00) [10]не, нихачу TThread... слишком уж много там всего напихано... :-(
Юрий Зотов (2008-01-10 00:55:00) [11]> maxistent © (10.01.08 00:43) [7]
Насколько помню, пример использования TThread есть в демках Delphi. А разжеванный пример - в статьях на этом сайте.
Германн (2008-01-10 00:45:00) [12]
> maxistent © (10.01.08 00:31) [4]
>
> ну не знаю я этого ТThread... да и потом, хочеца, чтобы
> всё своё собсное было, без лишних наворотов...
>
Ну тогда стоит начать с основы - с TObject.
maxistent (2008-01-10 00:43:00) [13]:-D ну ладно вам, хватит издеваццо. лучше бы кодом помогли...
Amoeba (2008-01-10 00:36:00) [14]
> maxistent © (10.01.08 00:31) [4]
>
> ну не знаю я этого ТThread... да и потом, хочеца, чтобы
> всё своё собсное было, без лишних наворотов...
И поэтому будем мастерить деревянный велосипед с прямоугольными колесами?
maxistent (2008-01-10 00:35:00) [15]...ну раз такое дело, можно примерчик какой-нить?..
maxistent (2008-01-10 00:31:00) [16]ну не знаю я этого ТThread... да и потом, хочеца, чтобы всё своё собсное было, без лишних наворотов...
Palladin (2008-01-09 23:54:00) [17]ох господи, сколько несуразностей... ну чем же тебе TThread не угодил вместо твоей поделки?
maxistent (2008-01-09 23:22:00) [18]...ой, пардон. вместо
BeginThread(nil,0,@DOLISTEN,p,0,id1);
там
BeginThread(nil,0,@MYTHREAD,p,0,id1);
maxistent (2008-01-09 23:19:00) [19]... p.s. используется "объект" так:
...
var
obj1:TMyObject;
...
begin
obj1.[переменная1]:=<значение>;
obj1.[переменная2]:=<значение>;
obj1.MainProc;
while true do sleep(1);
end.