Вниз
Скачать: CL | DM;

Такой вот вопрос   Найти похожие ветки 

← →
Nick-From ©   (2002-11-09 21:37) [0]

Есть тело потока:

function Execute (param: TMyPtr):Dword;
var
r: integer;
begin
r := param^;
if r > 0 then Result := 1
else Result :=0;
end;

,где TMyPtr = ^integer;

и есть процедура, вызывающая поток:

procedure TForm1.Button1Click(Sender: TObject);
var
SubThread, SubThreadID: THandle;
param: ^integer;
begin
Getmem(param, 4);
param^ := StrToInt(Edit1.text);


SubThread := CreateThread ( nil,
0,
@Execute,
param,
CREATE_SUSPENDED,
SubThreadID
);
ResumeThread(SubThread);
end;

в процессе выполнения которой возникает ACCESS VIOLATION на строке r := param^;

Вроде ведь параметры передаю правильно.
В чем проблема, может кто знает?


← →
Ученик ©   (2002-11-09 21:50) [1]

function Execute (param: TMyPtr):Dword; stdcall;


← →
Nick-From ©   (2002-11-10 01:27) [2]

Спасибо, заработало :)

А как взять возвращаемый параметр:
IntNumber := ResumeThread(SubThread); ???


← →
Ученик ©   (2002-11-10 08:47) [3]

The GetExitCodeThread function retrieves the termination status of the specified thread.

BOOL GetExitCodeThread(
HANDLE hThread, // handle to the thread
LPDWORD lpExitCode // termination status
);


← →
Nick-From ©   (2002-11-10 12:22) [4]

Изменяем текст программы:

function Execute (param: TMyPtr):Dword; stdcall;
var
r:integer;
res: DWord;
begin
r := param^;
if r > 0 then Res := 1
else Res :=0;
ExitThread(res);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
SubThread, SubThreadID: THandle;
param: ^integer;
res: dword;
begin
Getmem(param, 4);
param^ := StrToInt(Edit1.text);


SubThread := CreateThread ( nil,
0,
@Execute,
param,
CREATE_SUSPENDED,
SubThreadID
);

res:=0;
ResumeThread(SubThread);
GetExitCodeThread(SubThread, res);
edit2.Text := IntToStr(integer(res)) ;
end;


Но почему-то при любых раскладах он возыращает 259, что-то не так?


← →
Ученик ©   (2002-11-10 12:32) [5]

Суть в этом, реализация в зависимости от задачи

repeat
Sleep(0);
GetExitCodeThread(SubThread, res);
until res <> STILL_ACTIVE;
edit2.Text := IntToStr(integer(res)) ;



← →
Nick-From ©   (2002-11-10 19:54) [6]

Ну да, GetExitCodeThread возвращает мне STILL_ACTIVE так как:
"...If the specified thread has not terminated, the termination status returned is STILL_ACTIVE...",
а как же получить мои 1 или 0 из функции потока?

Пишут:
"...If the thread has terminated, the termination status returned may be one of the following:

· The exit value specified in the ExitThread or TerminateThread function.
· The return value from the thread function.
· The exit value of the thread"s process.

Как я понял, мне нужен второй пункт, так что же, для этого нужно писать: TerminateThread(SubThread, DWparam) ,где DWparam: DWord и есть 1 или 0 ???
Чего скажешь?



← →
Fantasist ©   (2002-11-10 21:56) [7]


ResumeThread(SubThread);
WaitForSingleObject(SubThread);
GetExitCodeThread(SubThread, res);


← →
Ученик ©   (2002-11-10 21:59) [8]

>Nick-From © (10.11.02 19:54)
Ученик © (10.11.02 12:32)
Это все что нужно добавить, чтобы получить требуемый результат, хотя и непонятно, зачем тут Thread

А почему бы не использовать стандартные классы для работы с Thread из Classes - TThread ?


← →
Nick-From ©   (2002-11-11 19:18) [9]

УРА, ЭТО СВЕРШИЛОСЬ !!!!!!!!!!!!!!!!
Я наконец-таки сделал эту прогу :)
Всем, кто помогал, ОГРОМНОЕ спасибо !!!
Special thanks to Ученик & Fantasist (Вряд ли что-нибудь написал бы без вашей помощи).
Не знаю, как и отблагодарить вас, могу выслать получившуюся прогу по мылу: "Программа рекурсивного нахождения определителя матрицы с использованием потоков (API) и указателей". Страшно звучит, правда :))

2Ученик
>Это все что нужно добавить, чтобы получить требуемый
>результат, хотя и непонятно, зачем тут Thread
>А почему бы не использовать стандартные классы для работы с >Thread из Classes - TThread ?

Такое вот задание - написать программу рекурсивного нахождения определителя матрицы с использованием потоков (API). Чтобы каждый шаг рекурсии просчитывался в своём потоке.
Спасибо!



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.011 c
8-69449
Darlok
2002-05-15 15:57
2002.11.21
Прозрачные окна


1-69343
antonioxxx
2002-11-11 12:54
2002.11.21
---|Ветка была без названия|---


3-69130
Leshik
2002-10-30 09:31
2002.11.21
Как соединить несколько баз по общему полю?


3-69191
ruslan_as
2002-11-01 11:11
2002.11.21
обновить одну запись


1-69327
Zhirnov Maxim
2002-11-12 17:15
2002.11.21
Как получить список компонентов на форме?




   Наверх