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

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
1-58176
v2k
2002-07-05 19:07
2002.07.18
Переместить папку


1-58116
MsGuns
2002-07-08 20:37
2002.07.18
Можно ли управлять


1-58060
werr
2002-07-05 17:04
2002.07.18
Как узнать каким юзером занят файл?


3-57999
billybons
2002-06-26 14:54
2002.07.18
А с SQL схема try.....except не работает ?


14-58266
IronHawk
2002-06-10 02:30
2002.07.18
Что день грядущий нам готовит .......





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