Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
ВнизТакой вот вопрос Найти похожие ветки
← →
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 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c