Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки и процедуры...


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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо