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

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

Такой вот вопрос [D5]


Nick-From ©   (2002-11-09 21:37:00) 

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

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^;

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


Nick-From   (2002-11-11 19:18:00) [1]

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

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

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


Ученик   (2002-11-10 21:59:00) [2]

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

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


Fantasist   (2002-11-10 21:56:00) [3]


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


Nick-From   (2002-11-10 19:54:00) [4]

Ну да, 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 ???
Чего скажешь?


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

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

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


Nick-From   (2002-11-10 12:22:00) [6]

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

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 08:47:00) [7]

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 01:27:00) [8]

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

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


Ученик   (2002-11-09 21:50:00) [9]

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


Наверх

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