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

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

Вызов процедуры в другом потоке с параметрами [Win2k, WinXP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

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