Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать процедуре параметр 
V
    Опции темы
Andreyzpr
Дата 12.10.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Вообщем столкнулся с такой проблемой:
Происходит запуск процедуры в отдельном потоке 255 раз.
Запуск процедуры происходит следующим способом:
Код

            CreateThread(nil, 128, @ScanNetwork, self, 0, h);


сама процедура такого типа:
Код

procedure ScanNetwork(adress:String);
var
hNetEnum: THandle;
NetContainerToOpen: NETRESOURCE;
ResourceBuffer: array[1..2000] of TNetResource;
i, ResourceBuf, EntriesToGet: DWORD;
List:TStringList;
begin
NetContainerToOpen.dwScope:=RESOURCE_GLOBALNET;
NetContainerToOpen.dwType:=RESOURCETYPE_ANY;
NetContainerToOpen.lpLocalName:=nil;
Form1.Memo1.Lines.Add('Сканируем адрес ' + adress);
NetContainerToOpen.lpRemoteName:= PChar('\\' + adress);
NetContainerToOpen.lpProvider:=nil;
WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE or RESOURCEUSAGE_CONTAINER,
@NetContainerToOpen, hNetEnum);
while TRUE do
 begin
  ResourceBuf:=sizeof(ResourceBuffer);
  EntriesToGet:=2000;
  if (NO_ERROR <> WNetEnumResource(hNetEnum, EntriesToGet,
  @ResourceBuffer, ResourceBuf)) then
    begin
     WNetCloseEnum(hNetEnum) ;
     exit;
    end;
List:=TStringList.Create;
for i:=1 to EntriesToGet do
List.Add(string(ResourceBuffer[i].lpRemoteName));
end;
end;


А проблема такова. Мне нужно, чтобы при запуске процедуры ей передался параметр (в моем случае IP адрес):
Тоесть мне нужно вызвать процедуру таким способом:
ScanNetwork('127.0.0.1');
А проблема такова:
Когда я запускаю в отдельном потоке процедуру таким способом:
Код

            CreateThread(nil, 128, @ScanNetwork('127.0.0.1'), self, 0, h);

т.е. передаю ей параметр, то программа не запускается, подчеркивает эту строчку и пишет ошибку:
[Error] Unit1.pas(102): Variable required

Если же я бещз скобок будут запускать ее (не буду давать параметр) то тогда все нормально запускается, а так получилось, что мне обязательно нужно передать ей параметр. Пробовал решить с помощью переменных - не получилось, процедура во время работы в сети медлительна - цикл где переменная изменяется работает быстрее.... 

Как мне сделать, чтобы можно таки было передать процедуре параметр?

PM MAIL WWW ICQ   Вверх
skyboy
Дата 12.10.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(Andreyzpr @  12.10.2007,  13:24 Найти цитируемый пост)
@ScanNetwork

объяви ещё одну процедуру.
Код

procedure some_proc()
begin
 scanNetwork("127.0.0.1");
end;

и работай с ней
Код

CreateThread(nil, 128, @some_proc, self, 0, h);

Да, это негибко. Но сделать эту самую some_proc параметризированной можно только если:
а) объявить глобальную переменную needle_ip
Код

procedure some_proc
begin
ScanNetwork(needle_ip);
end;

Если эта глобальная переменная будет меняться только в основном потоке - все будет нормально, в противном случае потребуется синхронизация.
б) переделать CreateThread(или написать обертку), которая позволит работать как с ^procedure, так и с ^(procedure of object)
самый адекватный по-моему:
В) третий с конца параметр функции CreateThread - единственный параметр, передаваемый в указанную функцию.  У тебя там стоит self. Лучше передать ip d виде числа. Или указатель на строку. А ты сейчас передаешь self, который потом пытается приводиться к строке(смотри объявление процедуры scanNetwork)

Добавлено через 59 секунд
из трех приведенных вариантов правильный - "В". Просто писал по мере прихода мыслей, остальное надо было удалить, чтоб не запутывать.

PM MAIL   Вверх
Rennigth
Дата 12.10.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Andreyzpr, А лутше воспользуйся классом TThread, где почти все уже за тебя сделано. Я как понял тебе же не обязательно чистый WinApi?

Это сообщение отредактировал(а) Rennigth - 12.10.2007, 14:50


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Andreyzpr
Дата 12.10.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



skyboy тоесть как заместо self передать?

Rennigth если чесно не умею єтим классом пользоваться smile
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 12.10.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Rennigth, а что это даст? Метод Execute в любом случае не имеет параметров. Правда параметры можно передать в конструктор класса. А еще он позволяет синхроинзироваться с VCL классами/данными основного потока.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 12.10.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(Andreyzpr @  12.10.2007,  15:04 Найти цитируемый пост)
Rennigth если чесно не умею єтим классом пользоваться  

Воспользуйся поиском по слову TThread, найдешь массу примеров. А с BeginThread/CreateThread замучаешься с синхронизацией если понадобиться. Ничего личного, но просто у тебя опыта может не хватить все грамотно написать на API.

Добавлено через 58 секунд
Цитата(Alexeis @  12.10.2007,  15:09 Найти цитируемый пост)
Правда параметры можно передать в конструктор класса.

Я о том же.

Добавлено через 1 минуту и 50 секунд
Или отдельными св-ми с резюмом трэда ручками.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Rennigth
Дата 12.10.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



А так в принципе почему вот так не передавать?

Код


procedure ScanNetwork(Param: Pointer);  stdcall;
var
  lIP: PChar;
begin
  lIP := GetMemory(255);
  ZeroMemory(lIP, 255);
  try
    MoveMemory(lIP, Param, 255);
    while True do
    begin
      Sleep(5000);
      MessageBox(0, lIP, nil, 0);
    end;
  finally
    FreeMemory(lIP)
  end;
end;

procedure TForm17.FormCreate(Sender: TObject);
var
  h: DWord;
begin
  CreateThread(nil, 128, @ScanNetwork, PChar('127.0.0.1'), 0, h);
end;



Добавлено через 2 минуты и 30 секунд
у CreateThread же 4й параметр для передачи параметров и существует.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
skyboy
Дата 12.10.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(Rennigth @  12.10.2007,  14:26 Найти цитируемый пост)
у CreateThread же 4й параметр для передачи параметров и существует.

угу. и я - о том же smile 
PM MAIL   Вверх
Andreyzpr
Дата 12.10.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Rennigth твой пример не работает :( С Опытом согласен, я только учусь smile))))

Добавлено через 3 минуты и 33 секунды
А что за 4 параметр для передачи? Куда он передает? Откуда извлечь его можно?
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 12.10.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(Andreyzpr @  12.10.2007,  16:02 Найти цитируемый пост)
Rennigth твой пример не работает :(

эт почему?
Покажи как ты вызываешь функцию. stdcall указал?

Добавлено через 3 минуты и 47 секунд
Цитата(Andreyzpr @  12.10.2007,  16:02 Найти цитируемый пост)
А что за 4 параметр для передачи? Куда он передает? Откуда извлечь его можно? 

Посмотри внимательней мой пример. 
1. Процедура которая передается в трэд должна обязательно иметь вид:
Код

procedure Proc(Param: Pointer);  stdcall;


2. 4й параметр функции CreateThread это указатель на параметр который передасться в Param процедуры трэда.

3. Обязательно процедура трэда должна быть stdcall.




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Andreyzpr
Дата 12.10.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Вообщем заработало, только появилась другая проблема! По завершении работы программа выбрасывает ошибку.. В чем тут недоработка:
Вот сама процедура:
Код

procedure ScanNetwork(Param: Pointer);  stdcall;
var
hNetEnum: THandle;
NetContainerToOpen: NETRESOURCE;
ResourceBuffer: array[1..2000] of TNetResource;
i, ResourceBuf, EntriesToGet: DWORD;
List:TStringList;
tmp:String;
begin
NetContainerToOpen.dwScope:=RESOURCE_GLOBALNET;
NetContainerToOpen.dwType:=RESOURCETYPE_ANY;
NetContainerToOpen.lpLocalName:=nil;
tmp:=String(param);
Form1.Memo1.Lines.Add('Сканируем адрес ' + tmp);
{NetContainerToOpen.lpRemoteName:= PChar('\\' + tmp);
NetContainerToOpen.lpProvider:=nil;
WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE or RESOURCEUSAGE_CONTAINER,
@NetContainerToOpen, hNetEnum);
while TRUE do
 begin
  ResourceBuf:=sizeof(ResourceBuffer);
  EntriesToGet:=2000;
  if (NO_ERROR <> WNetEnumResource(hNetEnum, EntriesToGet,
  @ResourceBuffer, ResourceBuf)) then
    begin
     WNetCloseEnum(hNetEnum) ;
     exit;
    end;
List:=TStringList.Create;
for i:=1 to EntriesToGet do
List.Add(string(ResourceBuffer[i].lpRemoteName));
end;}
end;

Обращаю внимание на то, что основные действия в процедуре закомментированы, т.е. что делает процедура - просто в мемо пишет: Сканируем адрес  и добавляет переданый параметр.
ЗАпуск происходит так:
Код

        for i:=0 to 5 do
          begin
            TempString:=m1 + '.' + m2 + '.' + m3 + '.' + IntToStr(i);  //Сдесь собирается айпи адрес (конечный вид 10.0.0. + i);
            CreateThread(nil, 128, @ScanNetwork, PChar(TempString), 0, h);
          end;

Все выводитяс в мемо и как только цикл завершается выходит ошибка и открывается окно CPU и море ошибок.
В чем проблема?
PM MAIL WWW ICQ   Вверх
skyboy
Дата 12.10.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(Andreyzpr @  12.10.2007,  15:32 Найти цитируемый пост)
выходит ошибка

какая? 
PM MAIL   Вверх
Rennigth
Дата 12.10.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



эх, вот никто меня и не слушает... :( 
Цитата

Form1.Memo1.Lines.Add('Сканируем адрес ' + tmp);

вот что эт такое? нельзя же так... я же не зря вот это говорил.
Цитата(Rennigth @  12.10.2007,  15:10 Найти цитируемый пост)
замучаешься с синхронизацией если понадобиться

Лан все поправимо, сейчас доработаю твой пример.



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Andreyzpr
Дата 12.10.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Цитата(Rennigth @ 12.10.2007,  16:37)
эх, вот никто меня и не слушает... :( 
Цитата

Form1.Memo1.Lines.Add('Сканируем адрес ' + tmp);

вот что эт такое? нельзя же так... я же не зря вот это говорил.
Цитата(Rennigth @  12.10.2007,  15:10 Найти цитируемый пост)
замучаешься с синхронизацией если понадобиться

Лан все поправимо, сейчас доработаю твой пример.

Извеняюсь за невнимательность, если не трудно, скажи где ошибся? ;)
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 12.10.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Andreyzpr, ты ж в потоке обращаешься к памяти которая используется одновременно и основным потоком тоже.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Andreyzpr
Дата 12.10.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Цитата(Alexeis @ 12.10.2007,  16:48)
Andreyzpr, ты ж в потоке обращаешься к памяти которая используется одновременно и основным потоком тоже.

Тоесть ты говориш про переменную TempString?
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 12.10.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Код

unit Unit17;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  MSG_THREAD_INFO = WM_USER + 123;

type
  PThreadParam = ^TThreadParam;
  TThreadParam = record
    Data: string[255];
    OwnerHandle: DWord;
  end;

  TForm17 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    FThreads: TStringList;
    FThreadParams: TList;
    procedure ThreadInfoEvent(var VMessage: TMessage); message MSG_THREAD_INFO;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

var
  Form17: TForm17;

implementation

{$R *.dfm}

procedure ScanNetwork(Param: Pointer);  stdcall;
var
  lParam: TThreadParam;
  ltmp: string;
begin
  MoveMemory(@lParam, Param, SizeOf(TThreadParam));

  {* здесь делай все что хочешь, сканируй сеть и т.д. только VCL не используй *}
  Sleep(1000); // это всесто твоей подготовки к сканированию или что там у тебя
  ltmp := 'Сканируем адрес ' + lParam.Data;
  PostMessage(lParam.OwnerHandle, MSG_THREAD_INFO, Integer(PChar(ltmp)), 0);
  Sleep(10000); // это всесто основных твоих действий
end;

procedure TForm17.Button1Click(Sender: TObject);
var
  i: Integer;
  hThread: DWord;
  hTmpID: DWord;
  lpParam: PThreadParam;
begin
  for i := 0 to 5 do
  begin
    lpParam := GetMemory(SizeOf(PThreadParam));
    lpParam^.Data := 'Blablabla' + IntToStr(i);  //Сдесь собирается айпи адрес (конечный вид 10.0.0. + i);
    lpParam^.OwnerHandle := Handle;
    FThreadParams.Add(lpParam);
    hThread := CreateThread(nil, 128, @ScanNetwork, lpParam, 0, hTmpID);
    if hThread > 0 then
      FThreads.Add(IntToStr(hThread))
    else
      RaiseLastOSError;
  end;
end;

constructor TForm17.Create(AOwner: TComponent);
begin
  inherited;
  FThreads := TStringList.Create;
  FThreadParams := TList.Create;
end;

destructor TForm17.Destroy;
var
  i: Integer;
  lHandle: DWord;
begin
  for i := 0 to FThreads.Count - 1 do
  begin
    lHandle := StrToIntDef(FThreads.Strings[i], 0);
    if lHandle > 0 then
      CloseHandle(lHandle);
  end;

  for i := 0 to FThreadParams.Count - 1 do
    FreeMemory(FThreadParams.Items[i]);

  FThreadParams.Free;
  FThreads.Free;
  inherited;
end;

procedure TForm17.ThreadInfoEvent(var VMessage: TMessage);
begin
  Memo1.Lines.Add(PChar(Pointer(VMessage.wParam)));
end;

end.



вот например такой примерчик. Не покушаюсь на оптимальнось и оригинальность. Хендлы тож конечно поздно закрываются, но с евентами не хочется возится. Я поэтому и предлагал TThread использовать smile

Добавлено через 4 минуты и 12 секунд
Цитата(Andreyzpr @  12.10.2007,  16:54 Найти цитируемый пост)
Тоесть ты говориш про переменную TempString? 

нет я о том что нельзя из отдельного потока напрямую использовать VCL. 
Я вот об этом: 
Код

Memo1.Lines.Add(...

Это не потоко безопасно! 

В моем примере передача данных форме сделана через очередь сообщений, это один из самых простых способов. Иначе, надо ручками организовывать синхронизацию, что без определенного опыта(которого и у меня особо нету) проблематично.



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Andreyzpr
Дата 12.10.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



ууууууууууу :( :( :( :( :(
А мой код в чувство никак привести нельзя? Вроде ж все работает, а по завершении цикла :( :( :( !!
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 12.10.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(Andreyzpr @  12.10.2007,  17:27 Найти цитируемый пост)
ууууууууууу :( :( :( :( :(
А мой код в чувство никак привести нельзя? Вроде ж все работает, а по завершении цикла :( :( :( !! 

К сожалению нет smile

Добавлено через 4 минуты и 19 секунд
Andreyzpr, чтобы понять почему так почитай, хошая статья smile
http://forum.vingrad.ru/topic-60076.html

Добавлено через 8 минут и 40 секунд
Andreyzpr, ты попробуй мой пример, там ничего сверх естественного нету. Работать с сетью в отдельном потоке можно, ничего страшного не будет.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Andreyzpr
Дата 12.10.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Я уже ту статью читал :(
Я совершенно не могу понять твоего кода.. что и куда вставить!!,
КАк я могу не использовать VCL если мне результат выводить надо...
Незнаю что такое constructor;
И самое плохое то что я показал была упращеная версия, и если бы она заработала там бы намного больше циклов шло бы....
А из за чего неработоспособна моя версия? Что там создает ошибку?
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 12.10.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(Andreyzpr @  12.10.2007,  17:52 Найти цитируемый пост)
Незнаю что такое constructor;

Constructor/Destructor это примерно тоже самое что и события OnFormCreate/OnFormDestroy, все можно было и туда вставить, просто я так привык smile

Цитата(Andreyzpr @  12.10.2007,  17:52 Найти цитируемый пост)
КАк я могу не использовать VCL если мне результат выводить надо...

В моем примере же выводиться. Обрати внимание на то, что я из процедуры трэда выполняю PostMessage, т.е. я посылаю сообщение главной форме с текстом "сканируем адрес и т.д.". А главная форма ловит это сообщение(метод ThreadInfoEvent) , и уже она добавляет этот текст в memo.

Цитата(Andreyzpr @  12.10.2007,  17:52 Найти цитируемый пост)
А из за чего неработоспособна моя версия? Что там создает ошибку? 


1. То что напрямую обращаешся к VCL.
2. Перед тем как ты передаешь указатель на параметр в процедуру трэда, ты для нее явно не выделяешь память, в итоге при выходе из области видимости, дельфи сама подчишает память, а ты в трэде пыташься ее использовать. Но это уже даже проблема не то что отдельный трэд, а так устроена дельфи, это просто всегда надо учитывать. Это сделано вприципе для облегчения жизни делфи-программиста, но есть случаи(как данный), когда это доставляет определенные трудности.


Это сообщение отредактировал(а) Rennigth - 12.10.2007, 18:10


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MetalFan
Дата 12.10.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Rennigth @  12.10.2007,  18:08 Найти цитируемый пост)
В моем примере же выводиться. 

я бы так не стал делать
Цитата(Rennigth @  12.10.2007,  17:18 Найти цитируемый пост)
procedure ScanNetwork(Param: Pointer);  stdcall;
var
  ltmp: string;
begin
...
  Sleep(1000); // это всесто твоей подготовки к сканированию или что там у тебя
  ltmp := 'Сканируем адрес ' + lParam.Data;
  PostMessage(lParam.OwnerHandle, MSG_THREAD_INFO, Integer(PChar(ltmp)), 0);
  Sleep(10000); // это всесто основных твоих действий
end;


никто не гарантирует, что сообщение будет обработано до того, как освободится память под ltmp после завершения потока


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Rennigth
Дата 14.10.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



MetalFan, 
мб... А если подумать то еще надо посмотреть как устроен PostMessage. Ведь когда отправляешь сообщение другому процессу ты же не заботишься о сохранности памяти... тем более что она выделена в другом процессе... smile   



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
dumb
Дата 14.10.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



Цитата(Rennigth @  14.10.2007,  12:39 Найти цитируемый пост)
Ведь когда отправляешь сообщение другому процессу ты же не заботишься о сохранности памяти...
в другие адресные пространства указатели отправлять особого смысла нет(исключением может быть случай, когда в ответ на сообщение, удаленный процесс делает ReadProcessMemory, но это редкость).

Цитата(Rennigth @  14.10.2007,  12:39 Найти цитируемый пост)
тем более что она выделена в другом процессе...
а выделение памяти в контексте АП получателя - это работа для WM_COPYDATA, причем SendMessage. smile

если и посылать асинхронно в пределах одного АП, то тогда выделять перед посылкой и освобождать после приема. хотя в данном конкретном случае неявную помощь может оказать "вумный" стринг - но тут я ни разу не уверен. smile
PM MAIL   Вверх
MetalFan
Дата 14.10.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Rennigth @  14.10.2007,  11:39 Найти цитируемый пост)
Ведь когда отправляешь сообщение другому процессу ты же не заботишься о сохранности памяти... тем более что она выделена в другом процессе... 

сорь, но не понял, о чем речь  smile 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Andreyzpr
Дата 14.10.2007, 20:38 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Думал, думал.. всетаки додумался как провернуть с переменными.. вроде работает, правда на 100% не уверен в работоспособности... Сделал таким способом:
Запуск?
Код

 begin
        index:=0;
        for i:=0 to 5 do
          begin
            TempString:=m1 + '.' + m2 + '.' + m3 + '.' + IntToStr(i);
            a[i]:=TempString;
          end;
        for i:=0 to 5 do
          begin
            CreateThread(nil, 128, @ScanNetwork, PChar('127.0.0.1'), 0, h);
          end;
      end;

где a это массив а index Integer;

Сама процедура:
Код

//начало
tmp:=a[index]; //Даем процедуре Адрес 
index:=index+1;  //Чтото типа счетчика
Form1.Memo1.Lines.Add('Сканируем адрес ' + tmp);
NetContainerToOpen.lpRemoteName:= PChar('\\' + tmp);
//и продолжение

Вообщм по такому принципу пустил... 
Впринципе, можно и ставить вопрос решенным,  т.к. по другому ничего придумать нельзя :( :( :(   
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 14.10.2007, 20:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Andreyzpr @  14.10.2007,  20:38 Найти цитируемый пост)
CreateThread(nil, 128, @ScanNetwork, PChar('127.0.0.1'), 0, h);

нехорошо

Цитата(Andreyzpr @  14.10.2007,  20:38 Найти цитируемый пост)
Form1.Memo1.Lines.Add('Сканируем адрес ' + tmp);

очень нехорошо


Цитата(Andreyzpr @  14.10.2007,  20:38 Найти цитируемый пост)
 т.к. по другому ничего придумать нельзя :( :( :(   

можно. плохо видимо придумывал


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 14.10.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



Цитата(Andreyzpr @  14.10.2007,  21:38 Найти цитируемый пост)
Сама процедура
user posted image
слов нет. одни эпитеты. и те не для огласки.

Andreyzpr, если ты не хочешь понимать, что и как происходит, то не мучай ни себя, ни других, а просто задай вопрос в ЦП.

такое впечатление, что человек просто проигнорил все ответы от начала и до конца топа... smile
PM MAIL   Вверх
Andreyzpr
Дата 14.10.2007, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



НУ я совершенно не понимаю ваших данный мне кодов! Это одно и тоже что я буду ехать на машине и не знать конструкции двигателя, и где то посередине дороги она сломается, и как мне ее дальше ремонтировать?
Ну скопирую я сейчас код, вставлю его, что от этого изменится? Захочу чтото подменить, добавить, или со временем усовершенствовать - а что там и как совершенно не понимаю и ничего не смогу сделать...!!!
Поэтому смысла тупо выделить тот код, нажать Ctrl+C, на форме Ctrl+V не вижу...

Добавлено через 1 минуту и 12 секунд
Ну вон вы говорили про PostMessage, а я не знаю что оно такое! Не пойму о чем спор там идет...
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 15.10.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Andreyzpr ты уже едешь на поломаной машине. Нужно подучить работу с потоками, а то будешь ломаться машина каждые 200м.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Andreyzpr
Дата 15.10.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Цитата(Alexeis @ 15.10.2007,  00:53)
Andreyzpr ты уже едешь на поломаной машине. Нужно подучить работу с потоками, а то будешь ломаться машина каждые 200м.

Тоже верно smile
А может есть какая нибудь книга про потоки? Я видел в интернете статьи, но там пишет например: Создаем поток и десять строчек кода! А где, что и какой параметр указывается не говорится, поэтому что либо понять сложно...
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 15.10.2007, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(dumb @  14.10.2007,  15:10 Найти цитируемый пост)
если и посылать асинхронно в пределах одного АП, то тогда выделять перед посылкой и освобождать после приема. хотя в данном конкретном случае неявную помощь может оказать "вумный" стринг - но тут я ни разу не уверен.  

Согласен, погорячился, выделять отдельно память надежнее в данном сллучае.

Цитата(MetalFan @  14.10.2007,  20:27 Найти цитируемый пост)
сорь, но не понял, о чем речь    

Заносит иногда. Сам сейчас читаю, и не вижу нити своих мыслей smile[/




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MetalFan
Дата 15.10.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Andreyzpr, почитай Рихтера например... я например много чего нового для себя вынес из его книги про программирование под Win.
а про потоки опять же статейка здесь была нелпохая.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Andreyzpr
Дата 2.11.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 4.2.2007
Где: Украина

Репутация: 1
Всего: 1



Мда, думал обойтись всетаки без потоков, но никак.. Пришлось таки помучиться с вашим кодом. Мышка слава богу целая осталась smile
А код таки работает smile smile smile Более менее понял что куда добавлять.. Спасибо всем кто помогал smile
PM MAIL WWW ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1043 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.