Форум: "Начинающим";
Текущий архив: 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