Текущий архив: 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.48 MB
Время: 0.038 c