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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.051 c
11-1196406133
Михаил
2007-11-30 10:02
2008.12.21
ListBox


15-1224062789
Илья Корстин
2008-10-15 13:26
2008.12.21
SQL Monitor для MSAccess


15-1224694104
TStas
2008-10-22 20:48
2008.12.21
Чем сделать из Audio CD MP3?


15-1224123146
Slider007
2008-10-16 06:12
2008.12.21
С днем рождения ! 16 октября 2008 четверг


15-1224050613
tesseract
2008-10-15 10:03
2008.12.21
lazarus подновился. исправлена куча ошибок,





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский