Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Трабл с CreateThread ..... Plz, help!   Найти похожие ветки 

 
Profffff   (2004-07-07 15:38) [0]

Создаю поток так:

CreateThread(nil, 0, @Session_Thread, @hClientSocket, 0, SessionThreadID);

Ф-ция Session_Thread имеет вид:

procedure Session_Thread(param: DWORD);

Переменная для передачи в дочерний поток hClientSocket типа 32-битное целое.

Проблема в том, что эта переменная НЕ передается по неизвестной причине в Session_Thread! Что не так?


 
Тимохов ©   (2004-07-07 15:44) [1]


>  Что не так?

не расшифорован термин "НЕ передается"

а вообще на фига вы указатель на переменную передаете, а не саму переменную? :))
переменная наверное локальная, в стеке - вот и лажа.

ЗЫ. Зачем изобретать велик - TThread чем не угодил?


 
Digitman ©   (2004-07-07 15:49) [2]


> по неизвестной причине


не передается она по давно известной причине - нежелание читать справку или невнимательное чтение оной

а в справке черным по белому сказано, что прототипом поточной функциии (!!!!) должен быть тип

TThreadFunc = function(Param: Pointer): Integer; stdcall;


 
y-soft ©   (2004-07-07 15:52) [3]

>Profffff   (07.07.04 15:38)

Используйте BeginThread

function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord; ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord; var ThreadId: LongWord): Integer;

Description

Use this routine or a TThread object to spawn separate threads of execution instead of calling the CreateThread Win32API directly. BeginThread encapsulates the Win32 CreateThread API call, but unlike CreateThread, it sets the global IsMultiThread variable, thereby making the heap thread-safe.

BeginThread takes a normal Pascal function as the thread function. Thread functions should handle all of their own exceptions. BeginThread sets up an exception frame that allows the system"s default exception handler to catch any of the thread"s exceptions that have not been handled.

Note: The application is terminated if there are any unhandled exceptions in the thread function.


 
Profffff   (2004-07-07 16:15) [4]

Ясно. Переделал ф-цию в вид
function Session_Thread(Param: Pointer): Integer; stdcall;

а при создании этого потока сделал так:
CreateThread(nil, 0, @Session_Thread, @hClientSocket, 0, SessionThreadID);

где hClientSocket - целое

Получаю Param в Session_Thread. Как мне его обратно преобразовать в целое? У меня выдается не то значение почему-то!


 
default ©   (2004-07-07 16:18) [5]

Profffff   (07.07.04 16:15) [4]
PInteger[PCardinal](Param)^ := NewValue


 
Digitman ©   (2004-07-07 16:26) [6]

CreateThread(nil, 0, @Session_Thread, Pointer(hClientSocket), 0, SessionThreadID);

function Session_Thread(hSocket: THandle): Integer; stdcall;
begin
..
end;


 
Alive ©   (2004-07-08 12:41) [7]


> прототипом поточной функциии (!!!!) должен быть тип

Согласен, но у меня почему то работает так:
procedure SchedulerThread (pPntr: Pointer); stdcall;


 
Digitman ©   (2004-07-08 12:45) [8]


> Alive ©   (08.07.04 12:41) [7]


угу.. работает .. до тех пор пока тебя не приспичит вернуть стандартным образом результат выполнения поточной ф-ции и получить его с пом. GetExitCodeThread()



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.036 c
1-1091976962
DeMoN_Astra
2004-08-08 18:56
2004.08.22
Log - и


14-1091397893
megabyte
2004-08-02 02:04
2004.08.22
Антикиркоровская акция а МИЭТе


10-1030551543
kavlad
2002-08-28 20:19
2004.08.22
CORBA-сервер, возвращающий файл.


14-1091453406
Экспериментатор
2004-08-02 17:30
2004.08.22
Ура, я купил ноутбук


3-1091434355
Dot
2004-08-02 12:12
2004.08.22
StringGrid & DBGrid