Главная страница
    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.009 c
14-58304
Skywalker
2002-06-21 15:19
2002.07.18
Как добавить *.pas в проект CPP Builder???


14-58274
Vvedensk
2002-06-20 15:43
2002.07.18
Запись на балванку....


1-58112
^Sanya
2002-07-08 17:40
2002.07.18
Delphi&декомпилляция


3-57933
kolonist2
2002-06-25 12:50
2002.07.18
Как создать в Делфи БД (не псевдонимб а именно БД)


1-58150
GrayFox
2002-07-04 23:15
2002.07.18
глючит ICQ API





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