![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateThread и метод класса [D5, D7, Win2k]
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)
> требует получить указатель на функцию
если требует именно функцию, какого ж лешего ты пытаешься не функцию, а процедуру(неважно - регулярную или метод класса) "подсунуть" ?