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

Вниз

Потоки в классах   Найти похожие ветки 

 
asddsa   (2008-11-14 10:37) [0]

Здраствуйте! хотел уточнить можно ли запускать потоки из созданных мной классов?
пример:
type
 TMyClass = class(TObject)
   private
     dw_r, dw_w: cardinal;

     function read_com(): boolean;
     function write_com(): boolean;
   public
     constructor Create;
     destructor Destroy; override;
     procedure Start;
 end;
...........................................................
procedure TMyClass.Start;
begin
   potok_read:=CreateThread(nil,0,@read_com,nil,CREATE_NEW,dw_r); (!!!!)
   potok_write:=CreateThread(nil,0,@write_com,nil,CREATE_NEW,dw_w); (!!!!)
end;

function TMyClass.read_com(): boolean;
begin
...
end;

function TMyClass.write_com(): boolean;
begin
...
end;

на строках создания потоков (!!!!) вылетает ошибка: E2036 variable required.
подскажите как быть? (Delphi 2007, WinXP)


 
Palladin ©   (2008-11-14 10:40) [1]

а с каких щей ты вдруг функциям значения присваиваешь?


 
Palladin ©   (2008-11-14 10:42) [2]

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


 
Сергей М. ©   (2008-11-14 10:42) [3]

Можно.
Но делается это так ка описано в справке к BeginThread()


 
asddsa   (2008-11-14 10:45) [4]


> Palladin

в смысле?
вот так объявлено, забыл дописать:

private
.............................
    potok_read, potok_write: THandle;
...............................................


 
Сергей М. ©   (2008-11-14 10:57) [5]


> CREATE_NEW


Это зачем ?


 
asddsa   (2008-11-14 11:08) [6]


> Это зачем ?

чтобы не резумить его...

сделал через beginthread:
type
TMyClass = class(TObject)
  private
    dw_r, dw_w: cardinal;
    potok_read, potok_write: integer;

    procedure read_com();
    procedure write_com();
  public
    constructor Create;
    destructor Destroy; override;
    procedure Start;
end;
...........................................................
procedure TMyClass.Start;
begin
  potok_read:=CreateThread(nil,0,@read_com,nil,CREATE_SUSPENDED,dw_r); (!!!!)
  potok_write:=CreateThread(nil,0,@write_com,nil,CREATE_SUSPENDED,dw_w); (!!!!)
end;

procedure TMyClass.read_com();
begin
...
end;

procedure TMyClass.write_com();
begin
...
end;

но выскакивает тоже самое...


 
Сергей М. ©   (2008-11-14 11:13) [7]


> чтобы не резумить его


"Резумить" потребуется если ты укажешь CREATE_SUSPENDED. А ты его не указал.
Так что выбрасывай нафих CREATE_NEW.


> выскакивает тоже самое


В справки черным по белому написано про "проблемный" параметр:

ThreadFunc is the thread function

А ты пытаешься скормить функциональный метод объекта, а не регулярную функцию


 
han_malign ©   (2008-11-14 11:32) [8]


> А ты пытаешься скормить функциональный метод объекта, а не регулярную функцию

- "скормить" то его можно, но если человек не понимает принципа вызова функций и то, что параметры и соглашение их передачи для callback-ов должных соответствовать прототипу - лучше не нужно...

классический метод:
function thread_read_com(context: Pointer): LongWord;stdcall;
var mc: TMyClass absolute context;
begin
    mc.read_com();
end;
...
potok_read:=CreateThread(nil,0,@thread_read_com,nil,0,dw_r);

kludge:
TMyClass = class(TObject)
 private
    procedure read_com();stdcall;
...
potok_read:=CreateThread(nil,0,@TMyClass.read_com,nil,0,dw_r);


 
Slym ©   (2008-11-14 11:40) [9]

type
 TMyClass = class(TObject)
 private
   dw_r, dw_w: cardinal;
   potok_read, potok_write: DWORD;
 protected
   function read_com():DWORD;stdcall;
   function write_com():DWORD;stdcall;
 public
   //constructor Create;
   //destructor Destroy; override;
   procedure Start;
end;

procedure TMyClass.Start;
var ThID:DWORD;
begin
 dw_r:=1234;
 potok_read:=CreateThread(nil,0,pointer(read_com),self,0,ThID);
 //potok_write:=CreateThread(nil,0,pointer(write_com),self,0,ThID);
end;

function TMyClass.read_com():DWORD;
begin
 while true do
 begin
   self.dw_r:=self.dw_r+1;
   sleep(1000);
 end;
result:=0;
end;


 
Сергей М. ©   (2008-11-14 11:43) [10]


> han_malign ©   (14.11.08 11:32) [8]


Я к тому чтобы Автор ощутил разницу с т.з. компилятора.
А скормить при желании можно, конечно же, все что угодно.


 
han_malign ©   (2008-11-14 11:45) [11]


> function read_com():DWORD;stdcall;
> ,self,
> result:=0;

- это я забыл уточнить...


 
Slym ©   (2008-11-14 12:20) [12]

кстати а почему стандартный TThread не так сделали? заморочки с MethodInstance намутили...


 
icWasya ©   (2008-11-14 14:53) [13]


> Slym ©   (14.11.08 12:20) [12]
> кстати а почему стандартный TThread не так сделали?

Как именно не сдалали?


 
han_malign ©   (2008-11-14 16:57) [14]


> заморочки с MethodInstance намутили...

- нет там MethodInstance - там ThreadWrapper - обертка для обработки исключений...


 
Slym ©   (2008-11-15 13:11) [15]

han_malign ©   (14.11.08 16:57) [14]
да напутал.. это с окошками MethodInstance...
давно генофонд не листал...



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

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

Наверх




Память: 0.51 MB
Время: 0.018 c
9-1176034915
Tonich
2007-04-08 16:21
2008.12.21
Столкновение объектов в пространстве (шариков)


15-1224564830
Slider007
2008-10-21 08:53
2008.12.21
С днем рождения ! 21 октября 2008 вторник


15-1224154710
Кто б сомневался
2008-10-16 14:58
2008.12.21
Почему у многих девушек нет подруг?


2-1226475983
Uno-84
2008-11-12 10:46
2008.12.21
Вывод на печать текст из PaintBox


10-1150811466
Smith
2006-06-20 17:51
2008.12.21
Как создать объект из dll?