Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateThread и метод класса [D5, D7, Win2k]


Страницы:   1 2

Dust ©   (2005-07-12 12:03:00) 

CreateThread требует получить указатель на функцию и ни в каком виде не хочет принимать метод класса, а именно
procedure TClientSocket.DoLoop();
DoLoop - метод
-----
даже если написать так -
type ptoctype = Procedure();
var prctp : ptoctype;
то
никак не удастя сделать следующее присвоение -
prctp:=DoLoop;

А потому мне пришлось сделать функцию-обёртку, только для вызова одного метода.
Как вы поступали в таких ситуациях? Существует ли другой выход?


Alex Konshin   (2005-07-12 23:22:00) [1]

isasa ©   (12.07.05 17:18) [21]
А если у меня процессор P4 с гипертрайдингом, где FPU фактически второй процессор, то инициализация его регистров
внутри приложения (процесса) выглядит по меньшей мере странно.

При переключении нитей состояние всех регистров сохраняются-восстанавливаются. Так что как инициализировал, так и будет. HT тут абсолютно ни при чем. Кстати, и для процесса могут сохраняться некие установки, по крайней мере я видел это в исходниках Windows CE, не думаю, что в NT+ сильно иначе.


DiamondShark   (2005-07-12 18:25:00) [2]

Кого-то очень сильно клинит...


ANB   (2005-07-12 17:24:00) [3]


> если требует именно функцию,
- а какя разница (с точки зрения Windows) между процедурой и функцией ?


isasa   (2005-07-12 17:18:00) [4]

А если у меня процессор P4 с гипертрайдингом, где FPU фактически второй процессор, то инициализация его регистров
внутри приложения (процесса) выглядит по меньшей мере странно.


evvcom   (2005-07-12 16:32:00) [5]


> Про FPU (floationg point unit - сопроцессор плавающей арифметики)
> - не понял.
> Чего его инициализировать. Он или есть, или его нет.

Я нарывался на ошибки сопроцессора в казалось бы безобидных ситуациях типа y := round(x); и получал через раз ошибку деления на ноль. Начал выяснять, оказалось неверно инициализировались служебные регистры FPU. А ты говоришь, чего инициализировать!


Alexander Panov   (2005-07-12 15:19:00) [6]

isasa ©   (12.07.05 13:48) [14]
Я работаю с  CreateThread и не имею головной боли,


А почему ты должен ее иметь?

Вот только BeginThread простейшая надстройка и ей пользоваться удобнее тем, что не надо думать о том, что для CreateThread, например, соглашение о передаче параметров StdCall...


isasa   (2005-07-12 14:34:00) [7]

Про FPU (floationg point unit - сопроцессор плавающей арифметики) - не понял.
Чего его инициализировать. Он или есть, или его нет.
Соответсвенно код компилируется или с инструкциями для него, или с эмуляцией оных.


Alex Konshin   (2005-07-12 14:18:00) [8]

А зачем тебе это помнить? Есть BeginThread, вот и используй.
Сама-то функция CreateThread конечно работает, но она не делает инициализацию нити для использования с RTL Delphi. Как я уже сказал, абсолютно аналогичная ситуация и для других RTL, например, для VC.
И там вовсе не обеспечение кроссплатформенности. Да, там есть понимание платформы, но именно для выполнения требуемых действий на той платформе, а эта функция была и в D3, где linux и не пахло. Там инициализируется FPU и стек. Потенциально неиспользование BeginThread может привести к неверной обработке исключений в нити. Выглядит это так, что при исключении нить просто пропадает, даже чирикнуть не успевает.
Наверно и какие-то эффекты с FPU, но я практически никогда FPU не использую, так что не в курсе, чем это грозит.


isasa   (2005-07-12 14:08:00) [9]

Работает начиная с D4(не сам придумал - Калверт посоветовал :))
Это просто прокладка ( :) ) для обеспечения кросс-платформы,
кроме того

function ThreadWrapper(Parameter: Pointer): Integer; stdcall;

формально, является

function ThreadWrapper(Parameter: PThreadRec): Integer; stdcall;

вот и помни. Неудобно.


Alex Konshin   (2005-07-12 13:56:00) [10]

ThreadWrapper там же.
Borland предупредил, а ты волен поступать как хочешь. Только предупреди пож-ста, какие программы ты написал, чтоб случайно не купить.
Кстати, в VC тоже существует обертка для этой API функции (по-моему даже называется так же) по той же причине.


isasa   (2005-07-12 13:48:00) [11]

Кроме
IsMultiThread := TRUE;
все транзит.
Я работаю с  CreateThread и не имею головной боли, что такое ThreadWrapper и где его искать.


Alex Konshin   (2005-07-12 13:44:00) [12]

isasa ©   (12.07.05 13:42) [11]
Ну и посмотри внимательнее на параметры CreateThread


Alex Konshin   (2005-07-12 13:42:00) [13]

Флаг этот важный. Он говорит менеджеру памяти, что нужно использовать синхронизацию.
Помимо этого там инициируется что-то в TLS и, насколько я помню, формируется фрейм на стеке. Иначе будут проблемы при exception.


isasa   (2005-07-12 13:42:00) [14]

>Там не только это.

модуль System

function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
 ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
 var ThreadId: LongWord): Integer;
var
 P: PThreadRec;
begin
 New(P);
 P.Func := ThreadFunc;
 P.Parameter := Parameter;
 IsMultiThread := TRUE;
 Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
   CreationFlags, ThreadID);
end;


begin...end   (2005-07-12 13:24:00) [15]

> Dust ©   (12.07.05 13:22) [8]

См. справку по BeginThread.


Dust   (2005-07-12 13:24:00) [16]

какая разница, будет ли этот флаг стоять...


Dust   (2005-07-12 13:22:00) [17]

TO: begin...end, Alex Konshin
ясно, спасибо,,,, но чем лучше BeginThread нежели CreateThread??


Alex Konshin   (2005-07-12 13:13:00) [18]

Там не только это.


isasa   (2005-07-12 13:13:00) [19]

Не принципиально

BeginThread(...)
=
IsMultiThread := TRUE;
CreateThread(...);


Digitman   (2005-07-12 13:05:00) [20]


> Dust ©   (12.07.05 12:03)


> требует получить указатель на функцию


если требует именно функцию, какого ж лешего ты пытаешься не функцию, а процедуру(неважно - регулярную или метод класса) "подсунуть" ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо