Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-69184
mafiya
2002-11-01 08:32
2002.11.21
Treeview для базы данных


1-69260
Gogi
2002-11-10 03:31
2002.11.21
Ошибка в программе


14-69505
Forever
2002-10-01 18:25
2002.11.21
Как убрать


14-69507
paren'
2002-11-01 23:23
2002.11.21
Есть шансы, как вы думаете?


1-69380
The_Vizit0r!
2002-11-09 19:45
2002.11.21
Вопрос по Image





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский