Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Андрей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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
8-1081771345
Dimbas
2004-04-12 16:02
2004.06.27
Проверка на наличие кодека


3-1085827809
KADAN
2004-05-29 14:50
2004.06.27
last insert id в MSSQL


6-1083491056
John
2004-05-02 13:44
2004.06.27
save html as txt


6-1083690307
Alpupil
2004-05-04 21:05
2004.06.27
Ping


4-1085129307
Yustas
2004-05-21 12:48
2004.06.27
Память





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский