powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Процедура объекта как параметр потока
9 сообщений из 9, страница 1 из 1
Процедура объекта как параметр потока
    #40068450
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Имею код, хочу параметризировать вызов метода в потоке

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
--------------------------------------------------------
implementation

  function MainThread(Param: Pointer): Integer;
  begin
    Result:=0;
    TAddSpan(Param).ExecuteLoop;
    PostMessage(TAddSpan(Param).Handle,Wm_ExitThread,0,LParam(Param));
  end;

  function MainThreat(Param: Pointer): Integer;
  begin
    Result:=0;
    TAddSpan(Param).ExecuteItem;
    PostMessage(TAddSpan(Param).Handle,Wm_ExitThread,0,LParam(Param));
  end;


  function Create_AddSpan(aFile: PAnsiChar; aList: PAnsiChar; aKind: OleVariant; aBars: OleVariant; aHandle: OleVariant; var aSql: OleVariant; var aRecordSet: OleVariant): Integer;
  var
    S: String;
    Id: Cardinal;
  begin
    Result:=1;
    A:=TAddSpan.Create();
    A.Handle := aHandle;
    if (Integer(aKind) =2) then Result:=BeginThread(Nil,0,@MainThread,A,0,Id);
    if (Integer(aKind) =3) then Result:=BeginThread(Nil,0,@MainThreat,A,0,Id);
  end;
--------------------------------------------------------




Хотел бы иметь такую архитектуру

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
--------------------------------------------------------
type
  TCallBack = function: THandle of object;

  TCallRecord = record
    methods: TCallBack;
  end;

implementation

  function MainAlter(Param: Pointer): Integer;
  var MainHandle: THandle;
      A: TCallRecord;
  begin
    Result:=0;
    A:=TCallRecord(Param^);
    MainHandle:=TCallBack(A.methods);
    PostMessage(MainHandle,Wm_ExitThread,0,LParam(Param));
  end;

  function Create_AddSpan(aFile: PAnsiChar; aList: PAnsiChar; aKind: OleVariant; aBars: OleVariant; aHandle: OleVariant; var aSql: OleVariant; var aRecordSet: OleVariant): Integer;
  var
    S: String;
    H:  THandle;
    R1, R2: TCallRecord;
    Id: Cardinal;
  begin
    Result:=1;
    A:=TAddSpan.Create();
    A.Handle := aHandle;
    R1.methods:=A.ExecuteLoop1;
    R2.methods:=A.ExecuteItem1;
    if (Integer(aKind) =2) then Result:=BeginThread(Nil,0,@MainAlter,@R1,0,Id);
    if (Integer(aKind) =3) then Result:=BeginThread(Nil,0,@MainAlter,@R2,0,Id);
  end;
--------------------------------------------------------



Ошибка памяти - подскажите что делаю не так
Спасибо
...
Рейтинг: 0 / 0
Процедура объекта как параметр потока
    #40068454
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй передавать только TCallBack вместо TCallRecord
и не вижу необходимости дополнительно приводить тип метода

или вообще передавай только Integer(aKind)
...
Рейтинг: 0 / 0
Процедура объекта как параметр потока
    #40068456
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747

или вообще передавай только Integer(aKind)


Указатель на Integer ?
Приведите пожалуйста пример
...
Рейтинг: 0 / 0
Процедура объекта как параметр потока
    #40068461
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточняю - мне не совсем ясно как передать
aKind и указатель на текущий объекта - нужно ДВА параметра, соответственно нужен тип record
...
Рейтинг: 0 / 0
Процедура объекта как параметр потока
    #40068464
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Уточняю - мне не совсем ясно как передать
aKind и указатель на текущий объекта - нужно ДВА параметра, соответственно нужен тип record

Аллоцируй record динамически и передавай указатель. BeginThread сам так и делает. Только освободить не забудь в MainAlter.

PS. MainThreat - это 5
...
Рейтинг: 0 / 0
Процедура объекта как параметр потока
    #40068468
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747
попробуй передавать только TCallBack вместо TCallRecord


Здесь тоже не совсем ясно - я передаю ФУНКЦИЮ объекта, соответственно заключаю
ее в Pointer, но вероятно передается результат выполнения

if (Integer(aKind) =3) then Result:=BeginThread(Nil,0,@MainAlter,Pointer(A.ExecuteItem1),0,Id);

пожалуйста приведите пример Вашего предложения
...
Рейтинг: 0 / 0
Процедура объекта как параметр потока
    #40068471
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xя передаю ФУНКЦИЮ объекта, соответственно заключаю ее в Pointer

Этот код не должен компилироваться в принципе, поскольку указатель на метод класса не
может быть приведён к любому другому указателю. Если оно таки компилируется - рапортуй баг
эмбаркадере.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Процедура объекта как параметр потока
    #40068478
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

да, насчет передачи метода через Pointer это я ошибся.

Скорее всего. у тебя портится рекорд, который ты передаешь, ведь он лежит на стеке, и что произойдёт с ним за то время что ты передал его в поток.

Так что да, используй указатель на рекорд new/dispose
...
Рейтинг: 0 / 0
Процедура объекта как параметр потока
    #40068630
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

Решил задачу через добавление поля в основной обьект

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
  function MainThread(Param: Pointer): Integer;
  begin
    Result:=0;
    if(TAddSpan(Param).Kind=2) then TAddSpan(Param).ExecuteLoop;
    if(TAddSpan(Param).Kind=3) then TAddSpan(Param).ExecuteItem;
    PostMessage(TAddSpan(Param).Handle,Wm_ExitThread,0,LParam(Param));
  end;


------------------------------------------------------------------------------------------------

  TAddSpan = class(TObject)
  private
    iKind:    Integer;
    sSql:     String;
 protected
    //
 public
    constructor Create(aFile: String; aBars: TProgressBar; aHandle: THandle; var aSql: OleVariant; var aRecordSet: OleVariant); virtual;
    destructor  Destroy; override;
    property    Kind: Integer  read iKind write iKind;



  A:=TAddSpan.Create(iif((Integer(aKind)=0)or(Integer(aKind)=3),'[Path]'+vbLine+String(aList),String(aFile)),B,H,aSql,aRecordSet);
  A.Kind:=aKind;

  if (Integer(aKind) =2) then Result:=BeginThread(Nil,0,@MainThread,A,0,Id);
  if (Integer(aKind) =3) then Result:=BeginThread(Nil,0,@MainThread,A,0,Id);



Т.е. все равно работать через RECORD (и обьект в некотором смысле и есть такой RECORD)

Спасибо

Модератор: Как мне оформить свое сообщение?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Процедура объекта как параметр потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]