Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.016 c
3-57956
dimanew
2002-06-26 08:22
2002.07.18
Пытаюсь изменить тип поля с интеджер на нумерик


3-58015
maniak
2002-06-19 12:16
2002.07.18
А где-же наши пароли ?


1-58151
DmitryV
2002-07-04 13:09
2002.07.18
Вывод в окно в


6-58251
kool
2002-05-08 16:39
2002.07.18
как соединяется KaAzA


1-58176
v2k
2002-07-05 19:07
2002.07.18
Переместить папку