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

Вниз

Передать потоку значения свойств объекта   Найти похожие ветки 

 
Андрей2   (2004-06-11 15:17) [0]

Имеется переменная типа Object. Тип Object, естественно, имеет свойства, процедуры и функции. При вызове одной из процедур запускается поток (Thread) при помощи функции CreateThread, который потомком класса TThread не является. А теперь вопрос: как этому потоку получить доступ к значениям свойств объекта (или передать необходимые значения свойств (или переменных) объекта при создании потока). Напоминаю ещё раз, что  класс TThread не используется (всвязи с тем, что приложение пишется без использования библиотеки VCL). Выложите, пожалуйста, пример кода, решающего эту проблему.


 
Тимохов ©   (2004-06-11 15:32) [1]

не используете tthread ну и ладно, но посмотреть в модуле classes как он реализован можно же и сделать так же?


 
panov ©   (2004-06-11 15:36) [2]

Передается указатель на объект, далее приводится тип, и можно с ним работать.


 
default ©   (2004-06-11 16:01) [3]

если с этим объектом могут в это же время работать и другие потоки, то придётся всё же использовать TThread(для обеспечения синхр-ии или делать что-то подобное TThread.Synhronize руками) поскольку через него можно обеспечить работу с "разделяемыми" объектами через выполнение работы с об-ом в рамках главного потока


 
Sandman25 ©   (2004-06-11 16:03) [4]

[3] default ©   (11.06.04 16:01)

Synchronize не обязательно. Можно через семафор, например.


 
Digitman ©   (2004-06-11 16:11) [5]

function MyThreadFunc(param: Pointer): Integer; stdcall;
begin
 with TSomeMyClass(param) do
  SomeProperty := SomeValue;
end;

ThreadResult := BeginThread(nil, 0, @MyThreadFunc, Pointer(TSomeMyClass.Create(SomeParams)), ...);


 
Андрей2   (2004-06-11 16:13) [6]

Тимохов. А других предложений нет? Переносить весь класс - не шутка ли... К тому же, он на столько сложно там реализован, и я только что глазком посмотрел на него и чуть не упал - там даже и класс TList задействован. Может и его посоветуете перенести?.. А его перенесу - ещё какие-нибудь классы появятся - опять перенесу их реализацию себе - и в итоге получу новый VCL... Извините, но ваш совет не рационален, и для решения данной проблемы, к сожалению, мне не подходит. Есть ещё варианты?


 
Digitman ©   (2004-06-11 16:20) [7]

>  совет не рационален, и для решения данной проблемы, к сожалению,
> мне не подходит


очень даже подходит !
внимательное изучение исх.текстов от Борланда решает большую часть проблем по пониманию происходящего, на то Борланд и поставляет исх.тексты своих классов


> чуть не упал - там даже и класс TList задействован



ну и что ? это так сложно разобраться, зачем он там используется, чтобы на основании этого принять решение о необходимости полного/частичного переноса или отсутствию таковой ?


 
Андрей2   (2004-06-11 20:26) [8]

Времени на разборы уйдёт слишком много, а оно мне дорого.


 
Андрей2   (2004-06-11 20:27) [9]

Разобрал решение, предложенное Digitman. Он дал очень краткий и неполный ответ, однако в синтезе с решением данной задачи при помощи TThread (там тоже используется класс), у меня родилось решение данной задачи. За решение вырожаю ОГРОМНОЕ ему спасибо. Всё отлично работает. И на последок приведу полный код того, что у меня получилось "для будущего поколения" (чтобы все, кто интересунтся данным вопросом нашли для себя решение сразу):


type
 Props = class
   private
     s: string;
     b: byte;
     c: char;
     i: integer;
   public
     constructor Create;
   end;

constructor Props.Create;
begin

end;

procedure Thread(pr: Props);
begin
 showmessage(pr.s);
 showmessage(IntToStr(pr.b));
 showmessage(pr.c);
 showmessage(IntToStr(pr.i));
end;

var
 p: pointer;
 h, id: cardinal;
begin
 p:=Pointer(Props.Create);
 Props(p).s:="Передаваемая строка";
 Props(p).b:=73;
 Props(p).c:="ж";
 Props(p).i:=26507;
 h:=BeginThread(nil, 0, @Thread, p, 0,id);
 WaitForSingleObject(h,infinite);
 CloseHandle(h);
end.


Код выше - это лишь один из возможных вариантов решения задачи, демонстрационный вариант. Но проблема, над которой я сейчас работаю, естественно, сложнее, чем я описал выше, но её решение не входит в рамки данного форума, да и пока я справляюсь сам. В этой ветке форума я лишь передал скелет подводного камня, попавшегося на моём пути. Всем участвующим в данной ветке, пытавшимся мне помочь, большое спасибо, и данную ветвь форума, наверное, можно закрыть (при условии, что отсутствуют другие способы решения этой задачи).


 
MBo ©   (2004-06-11 20:58) [10]

сравни объявления:
function MyThreadFunc(param: Pointer): Integer; stdcall;
и
procedure Thread(pr: Props);

разницу видишь? а она есть!
И то, что сейчас программа сработала - случайность.


 
default ©   (2004-06-11 22:25) [11]

и конструктор пустой незачем объявлять



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

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

Наверх




Память: 0.49 MB
Время: 0.029 c
8-1080393670
Skeld
2004-03-27 16:21
2004.06.27
Вопрос по OpenGL?


6-1083623695
Eugene13
2004-05-04 02:34
2004.06.27
База видео фильмов в инете...


1-1087023799
KLAUS
2004-06-12 11:03
2004.06.27
Подскажите как Выислить точку входа (Entry Point),


14-1086913129
iZEN
2004-06-11 04:18
2004.06.27
Дикая охота


3-1086085868
panthera
2004-06-01 14:31
2004.06.27
Вопросы по базам данных