![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов процедуры в другом потоке с параметрами [Win2k, WinXP]
__DATA__ © (2006-03-01 11:27:00)Как вызвать процедуру в другом потоке с параметрами?
Делаю так :
procedure TForm1.Button1Click(Sender: TObject);
procedure WBNavigate(URL: String);
begin
URL := URL;
end;
var
s: String;
c: Cardinal;
begin
s := 'www.rambler.ru';
CreateThread(nil,SizeOf(s),@WBNavigate,@s,0,c);
end;
Но в процедуре WBNavigate переменная URL = '', хотя в ней должно было быть 'www.rambler.ru'. Почему значение переменной в процедуру не передается?
И еще как передать в поточную процедуру несколько параметров?
Fay (2006-03-03 17:46:00) [21]2 begin...end © (03.03.06 17:13) [12]
> при выходе из обработчика Button1Click
При выходе - это после выхода?
> не будет финализирована
А до какого момента?
begin...end (2006-03-03 17:13:00) [22]> Leonid Troyanovsky © (03.03.06 17:08) [11]
Зуб давать, конечно, не буду, но не вижу причин, по которым указанный способ в данном случае может быть нерабочим. Строка s при выходе из обработчика Button1Click не будет финализирована, и в поточную функцию передастся рабочий указатель на тело константной строки (плюс длину и счётчик ссылок, который -1). Почему бы этим указателем не воспользоваться внутри функции?
Leonid Troyanovsky (2006-03-03 17:08:00) [23]
> begin...end © (03.03.06 16:55) [10]
> Можно и предложенным способом.
Зуб даешь? ;)
--
Regards, LVT.
begin...end (2006-03-03 16:55:00) [24]> Leonid Troyanovsky © (03.03.06 14:04) [9]
> Т.е., не предложенным способом.
Можно и предложенным способом. Хотя и не нужно.
> Кроме того, непонятно зачем <--2
Да, в данном случае (присваивание константы-литерала) это лишнее.
Leonid Troyanovsky (2006-03-03 14:04:00) [25]
> GrayFace © (03.03.06 11:05) [8]
> Строки тоже можно передавать:
Не верю.
Т.е., не предложенным способом.
Кроме того, непонятно зачем <--2
--
Regards, LVT.
GrayFace (2006-03-03 11:05:00) [26]Строки тоже можно передавать:
function WBNavigate(P: Pointer): LongInt; stdcall;
var
URL: String;
begin
pointer(URL) := p; <-- 1
end;
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s := 'www.rambler.ru';
CreateThread(nil,SizeOf(s),@WBNavigate,pointer(s),0,c);
pointer(s):=nil; <-- 2
end;
__DATA__ (2006-03-01 12:26:00) [27]Пасиб, заработался... :)
isasa (2006-03-01 12:23:00) [28]procedure TForm1.Button1Click(Sender: TObject);
function WBNavigate(P: Pointer): LongInt; stdcall;
...
var
c: Cardinal;
s: String; <--------------- вот тут переменную создали в стеке
begin
s := 'www.rambler.ru';
CreateThread(nil,SizeOf(s),@WBNavigate,@s,0,c); <----вот тут запустили поток
end; <---------- вот тут переменной s: String; уже нет, а поток еще есть, или нет?
Объявить ее как поле класса (public, private - по вкусу)
__DATA__ (2006-03-01 12:16:00) [29]function WBNavigate(P: Pointer): LongInt; stdcall;
var
pc: PChar;
begin
pc := p;
MessageBoxA(0,pc,pc,0);
end;
Тоже бяка! :(
и
function WBNavigate(P: Pointer): LongInt; stdcall;
var
pc: PChar;
begin
pc := PChar(p);
MessageBoxA(0,pc,pc,0);
end;
Тоже!
isasa (2006-03-01 12:04:00) [30]А строку через PChar?
__DATA__ (2006-03-01 11:56:00) [31]procedure TForm1.Button1Click(Sender: TObject);
function WBNavigate(P: Pointer): LongInt; stdcall;
var
URL: String;
begin
URL := String(p);
end;
var
c: Cardinal;
s: String;
begin
s := 'www.rambler.ru';
CreateThread(nil,SizeOf(s),@WBNavigate,@s,0,c);
end;
Теперь в URL какая-то бяка передается ... :(
Теперь
isasa (2006-03-01 11:51:00) [32]И еще как передать в поточную процедуру несколько параметров?
Поток
type
TCheckURL = record
msgWnd : HWND;
idURL,idPrx : integer;
URL: string;
Proxy: string;
Port: integer;
login : string;
pass : string;
Result : integer;
bufLen : Longword;
Header, Body : string;
end;
pURLs = ^TCheckURL;
function CheckURL(p : pointer) : longint; stdcall;
var cURL : pURLs;
...
begin
...
cURL:=pURLs(p);
вызов
var
cURL : TCheckURL;
...
cURL.login := login.Text;
cURL.Pass := pass.Text;
...
hThread:=CreateThread(nil, 0, @CheckURL, @cURL, 0, ThreadID);
isasa (2006-03-01 11:46:00) [33]Функция должна быть
TThreadFunc = function (p : pointer) : longint; stdcall;