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

Вниз

Потоки и процедуры...   Найти похожие ветки 

 
maxistent ©   (2008-01-09 23:15) [0]

Всем доброго времени. Прошу помочь вот с чем. Мне нужно создать некий объект, в котором будут приватные и общедоступные процедуры и переменные. Так вот. При вызове одной из процедур, она (процедура) должна выполнить некоторые действия и создать отдельный поток для обработки этих "действий", передав ему на "рассмотрение" некоторые переменные. Тот самый поток после длительного процесса обработки должен передать результаты другой процедуре (так же, в виде переменных). У меня почти всё получилось, кроме последнего. Вот, код приблизительно такого плана:

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.

...специально сократил, чтобы не утомлять читателя и не занимать много места.
Вот. Как мне быть в этой ситуации? Как сделать, чтобы всё находилось и выполнялось в пределах ОДНОГО объекта?


 
maxistent ©   (2008-01-09 23:19) [1]

... p.s. используется "объект" так:

...
var
obj1:TMyObject;
...
begin
obj1.[переменная1]:=<значение>;
obj1.[переменная2]:=<значение>;
obj1.MainProc;
while true do sleep(1);
end.


 
maxistent ©   (2008-01-09 23:22) [2]

...ой, пардон. вместо

BeginThread(nil,0,@DOLISTEN,p,0,id1);

там

BeginThread(nil,0,@MYTHREAD,p,0,id1);


 
Palladin ©   (2008-01-09 23:54) [3]

ох господи, сколько несуразностей... ну чем же тебе TThread не угодил вместо твоей поделки?


 
maxistent ©   (2008-01-10 00:31) [4]

ну не знаю я этого ТThread... да и потом, хочеца, чтобы всё своё собсное было, без лишних наворотов...


 
maxistent ©   (2008-01-10 00:35) [5]

...ну раз такое дело, можно примерчик какой-нить?..


 
Amoeba ©   (2008-01-10 00:36) [6]


> maxistent ©   (10.01.08 00:31) [4]
>
> ну не знаю я этого ТThread... да и потом, хочеца, чтобы
> всё своё собсное было, без лишних наворотов...

И поэтому будем мастерить деревянный велосипед с прямоугольными колесами?


 
maxistent ©   (2008-01-10 00:43) [7]

:-D ну ладно вам, хватит издеваццо. лучше бы кодом помогли...


 
Германн ©   (2008-01-10 00:45) [8]


> maxistent ©   (10.01.08 00:31) [4]
>
> ну не знаю я этого ТThread... да и потом, хочеца, чтобы
> всё своё собсное было, без лишних наворотов...
>

Ну тогда стоит начать с основы - с TObject.


 
Юрий Зотов ©   (2008-01-10 00:55) [9]

> maxistent ©   (10.01.08 00:43) [7]

Насколько помню, пример использования TThread есть в демках Delphi. А разжеванный пример - в статьях на этом сайте.


 
maxistent ©   (2008-01-10 01:07) [10]

не, нихачу TThread... слишком уж много там всего напихано... :-(


 
Юрий Зотов ©   (2008-01-10 01:12) [11]

> maxistent ©   (10.01.08 01:07) [10]

Тогда передавайте в поточную функцию адрес своего объекта, а в ней приводите тип и юзайте его на здоровье. Но не забудьте, что когда программист сам скрещивает ежа с ужом, то и за последствия он отвечает тоже сам (это к вопросу о потокобезопасном коде).


 
Slym ©   (2008-01-10 06:07) [12]

maxistent ©   (10.01.08 1:07) [10]
тогда либо передвавай нужный объект в MyThread(OBJ:Pointer);


 
maxistent ©   (2008-01-10 09:39) [13]

О, это уже интереснее! :-) пасиб, попробую...


 
maxistent ©   (2008-01-10 09:40) [14]

О, это уже интереснее! А я как-то сразу и не подумал... :-) пасиб, попробую...


 
maxistent ©   (2008-01-10 09:43) [15]

только вот не пойму, КАК УЗНАТЬ адрес объекта из самого объекта?


 
Сергей М. ©   (2008-01-10 09:48) [16]


> maxistent ©   (10.01.08 09:43) [15]


Что значит "из самого объекта" ?
В теле его метода что ли ?
Тогда Self.


 
oxffff ©   (2008-01-10 10:35) [17]


> 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;


 
maxistent ©   (2008-01-10 11:01) [18]


> Сергей М. ©   (10.01.08 09:48) [16]

Точно! почему я сам не "допёр"?.. стареем :-( ВСЕМ СПАСИБО!!! ВСЁ, ЗАРАБОТАЛО! :-D

FreeMem(maxistent);


 
Сергей М. ©   (2008-01-10 11:39) [19]


> oxffff ©   (10.01.08 10:35) [17]



> CreateThread


Провоцируешь Автора на потенциальные грабли.



Страницы: 1 вся ветка

Текущий архив: 2008.10.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
15-1219142824
Vlad Oshin
2008-08-19 14:47
2008.10.12
откомпилируйте, пожалуйста, чему у вас получилось = i?


3-1207766708
Delphi7
2008-04-09 22:45
2008.10.12
Access/ADO/Delphi7, Проблема с LookUp-полями


2-1220289348
Age
2008-09-01 21:15
2008.10.12
Горячие клавиши


2-1220874482
aaandy21
2008-09-08 15:48
2008.10.12
как связать написанную на Delphi DLL c VC?


2-1220425933
Сергей
2008-09-03 11:12
2008.10.12
Как отключить выбор пункта по первым буквам в ComboBox?