Текущий архив: 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