Текущий архив: 2002.07.18;
Скачать: CL | DM;
Вниз
CreateThread(... Найти похожие ветки
← →
Serd_hhc (2002-05-18 06:21) [0]Уважаемые мастера,
Объясните, пжалуйста, в чём моя ошибка.
......
type TSerdWinSocket = class
constructor Create;
destructor Destroy; override;
procedure OpenPort1;
public
private
end;
...
constructor TSerdWinSocket.Create;
begin
CreateThread(nil,0,@OpenPort1,nil,0,SockID);
end;
.....
И она ругается "Variable required" на строчке CreateThread(nil,0,@OpenPort1,nil,0,SockID);
В чём ошибка?
Заранее спасибо ответившим.
← →
MBo (2002-05-18 07:41) [1]на мой взгляд,
LPTHREAD_START_ROUTINE lpStartAddress
не должно быть методом класса
← →
Lady BadnBadn (2002-05-18 08:00) [2]Вы забыли указать, что ф-ия OpenPort1 принадлежит классу TSerdWinSocket, т.е. по правилам синтаксиса, надо писать
CreateThread(nil,0,@OpenPort1,nil,0,SockID);
Вообще-то я бы не рекомендовала применять в качестве ф-ии потока метод класса, ибо в ней нельзя обращаться к полям и методам класса - она вызывается "в отрыве" от экземпляра класса. Т.е. если в ней вы не обращаетесь к полям и методам своего класса, то можно, иначе будет Access Violation.
Вот примерчик, который демонстрирует такое: (нужно 2 кнопки и их события)
procedure TForm1.Button1Click(Sender: TObject);
var SockID:Cardinal;
begin
CreateThread(nil,0,
@TForm1.Button2Click,
nil,0,SockID);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//ShowMessage("Button is pressed");
Button1.Enabled:=False;
end;
И вообще, почему бы не воспользоваться стандартным TThread и не мучаться.
← →
Lady BadnBadn (2002-05-18 08:02) [3]Простите,
CreateThread(nil,0,@ TSerdWinSocket.OpenPort1,nil,0,SockID);
← →
gate A20 (2002-05-18 13:35) [4]насколько мне известно, потоковая функция должна быть такого типа:
function Func(param: pointer): dword; stdcall;
причём она должна быть ещё и static. Вообще, создание потока на базе члена класса - не самая клёвая идея, на мой взгляд. Если надо, с ходу могу назвать пару вещей, почему.
← →
Lady BadnBadn (2002-05-18 14:58) [5]> gate A20
Назови, пожалуйста.
← →
gate A20 (2002-05-18 15:45) [6]ну вот смотри. Как было сказано, такой поток никак не связан с экземпляром класса (тобой же и было сказано). Отсюда проистекают проблемы доступа к членам класса, как ты сказал(а), к тому же, при убиении экземпляра класса надо специально озадачиватся убиением потока, а если в том процессе, где вся шняга происходит, вообще много экземпляров такого класса? В классе создавать некий ивент, которым сигнализировать потоку об его убийстве, а самому потоку хэндл этого ивента аргументом передавать? Можно. Но зачем? Я например потоки всегда леплю вне класса, и не имею проблем с этим делом.
Да!! Важное имхо! там товарищ Serd_hhc юзал CreateThread. А вот товарищ Рихтер и многие другие настоятельно НЕ советуют использовать его. Применительно к дельфи стоит юзать BeginThread, или выставлять в начале проги IsMultiThread. По-моему, этот вопрос фиг знает сколько раз всплывал и здесь, и на рсдн.
← →
Romkin (2002-05-18 17:27) [7]В Делфи надо пользоваться BeginThread... там не только isMultiThread устанавливается, но и инициализируются примочки Delphi (Exception etc) см ThreadWrapper
Страницы: 1 вся ветка
Текущий архив: 2002.07.18;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.005 c