![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки в классах
asddsa © (2008-11-14 10:37:00)Здраствуйте! хотел уточнить можно ли запускать потоки из созданных мной классов?
пример:
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)
Slym (2008-11-15 13:11:00) [1]han_malign © (14.11.08 16:57) [14]
да напутал.. это с окошками MethodInstance...
давно генофонд не листал...
han_malign (2008-11-14 16:57:00) [2]
> заморочки с MethodInstance намутили...
- нет там MethodInstance - там ThreadWrapper - обертка для обработки исключений...
icWasya (2008-11-14 14:53:00) [3]
> Slym © (14.11.08 12:20) [12]
> кстати а почему стандартный TThread не так сделали?
Как именно не сдалали?
Slym (2008-11-14 12:20:00) [4]кстати а почему стандартный TThread не так сделали? заморочки с MethodInstance намутили...
han_malign (2008-11-14 11:45:00) [5]
> function read_com():DWORD;stdcall;
> , self,
> result:=0;
- это я забыл уточнить...
Сергей М. (2008-11-14 11:43:00) [6]
> han_malign © (14.11.08 11:32) [8]
Я к тому чтобы Автор ощутил разницу с т.з. компилятора.
А скормить при желании можно, конечно же, все что угодно.
Slym (2008-11-14 11:40:00) [7]
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;
han_malign (2008-11-14 11:32:00) [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);
Сергей М. (2008-11-14 11:13:00) [9]
> чтобы не резумить его
"Резумить" потребуется если ты укажешь CREATE_SUSPENDED. А ты его не указал.
Так что выбрасывай нафих CREATE_NEW.
> выскакивает тоже самое
В справки черным по белому написано про "проблемный" параметр:
ThreadFunc is the thread function
А ты пытаешься скормить функциональный метод объекта, а не регулярную функцию
asddsa (2008-11-14 11:08:00) [10]
> Это зачем ?
чтобы не резумить его...
сделал через 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 10:57:00) [11]
> CREATE_NEW
Это зачем ?
asddsa (2008-11-14 10:45:00) [12]
> Palladin
в смысле?
вот так объявлено, забыл дописать:
private
.............................
potok_read, potok_write: THandle;
...............................................
Palladin (2008-11-14 10:42:00) [13]извиняюсь, не вдумался, создание потока требует обыкновенной функции на входе, ты же пытаешься передать метод
Сергей М. (2008-11-14 10:42:00) [14]Можно.
Но делается это так ка описано в справке к BeginThread()
Palladin (2008-11-14 10:40:00) [15]а с каких щей ты вдруг функциям значения присваиваешь?