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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Threads, Threads - как создать потоки? 
:(
    Опции темы
Barovskiy
Дата 16.1.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(alexeis1 @ 16.1.2006, 13:12 Найти цитируемый пост)

ероятно неверно завершается поток smile (очень частая ошибка)


Хех, верно.... но как его завершить????
PM MAIL   Вверх
_hunter
Дата 16.1.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



никак. поставь FreeOnTerminate в true и он сам остановится
Добавлено @ 13:39
точнее умрет


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexeis
Дата 16.1.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



я не очень понял какой вариант использования потоков используется.
Если Делфийский то вызов Terminate затем ожидание завершения
Waitfor затем освобождение памяти.


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

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

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


Шустрый
*


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

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



Цитата(_hunter @ 16.1.2006, 13:39 Найти цитируемый пост)

никак. поставь FreeOnTerminate в true и он сам остановится
Добавлено @ 13:39
точнее умрет


сделал так

Код

var
 ...
  FreeOnTerminate: boolean;

....

finally 
 FreeOnTerminate:=true;


все равно вылетает

Цитата(alexeis1 @ 16.1.2006, 13:41 Найти цитируемый пост)

я не очень понял какой вариант использования потоков используется.
Если Делфийский то вызов Terminate затем ожидание завершения
Waitfor затем освобождение памяти.



У меня дельфийский медот
Можно какойнить пример??? я не совсем понимаю куда писать

smile

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


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

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



Поставь FreeOnTerminate в начале кода.
Т.е.:
Код

procedure TMyThread.Execute;
begin
  FreeOnTerminate := true;
  //Дальше твой код
end;

И еще, когда создаешь поток (может это уже было написано, но я повторю), нужно делать вот так:
Код

MyThread := TMyThread.Create(false); //Именно false, а не true, когда с FreeOnTerminate работаешь. 



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
_hunter
Дата 16.1.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



а это:
Цитата(Barovskiy @ 16.1.2006, 12:57 Найти цитируемый пост)

var
...
  FreeOnTerminate: boolean;

зачем?
FreeOnTerminate это свойствр класса TThread...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexeis
Дата 16.1.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Код

        tr.Terminate;
        tr.WaitFor;
        tr.Free;
        tr := nil;
 

Добавлено @ 14:15
Кроме того в потоке нужно перодически проверять
свойстро terminated если оно true то закончить работу потоковой процедуры.(выйти)


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

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

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


Шустрый
*


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

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



Выкладываю код ... у меня едит крыша, я совсем запутался.... (((((((((


Код


procedure ChekIp;
var
  s: TStrings;
  d, i: integer;
  FreeOnTerminate: boolean;

begin
FreeOnTerminate := true;

                          
  if Form1.filepath.Text<>'' then begin
  s := TStringList.Create;
  Form1.Label1.Caption:='0';
Form1.Label4.Caption:='0';
Form1.Label6.Caption:='0';
Form1.Label8.Caption:='0';
Form1.Label11.Caption:='0';
Form1.Button1.Enabled:=false;
 Form1.label9.Caption:='Begin';
 stop:= false;
 Form1.label6.Font.Color:= clBlack ;

  try
     s.LoadFromFile (Form1.OpenDialog1.FileName);
      for d := 0 to s.Count -1 do begin
      Form1.label1.Caption:= floattostr(strtofloat(Form1.label1.Caption)+1);


      end;
   for i := 0 to s.Count - 1 do begin
   if Stop=true then Break;


  Form1.edit1.Text := Copy (s[i], 1, Pos ('', s[i]) - 1);
    Form1.Label4.Caption:=floattostr(strtofloat(Form1.Label4.Caption)+1);

      Form1.label9.Caption:='Checking...';
      
       try
        begin                            //  Yield;

     .....
       except
        on E: Exception do
        begin
        Form1.memo1.Lines.Add(E.Message);
        Form1.Edit3.Text:=(E.Message);
        end;
       end;

    if Form1.edit3.Text='Socket Error # 11001'+#13#10+'Host not found.' then
    begin
   Form1.label9.Caption:='Host not found...';
   Form1.memo1.Lines.add(Form1.edit3.Text);
   Form1.memo1.Lines.SaveToFile('Log.txt');
    break;

    end else

    ...........

  finally
    s.Free;
    Form1.label9.Caption:='Complite';
    Form1.Label4.Caption:='0';
    Form1.Button1.Enabled:=true;
    Form1.memo1.Lines.SaveToFile('Log.txt');
    FreeOnTerminate:= true;

  end;

ChekIp.Terminate;
        
end;
end;


а вот сама кнопка
Код


procedure TForm1.Button1Click(Sender: TObject);
var
h:cardinal;
ChekIp :TThread;

begin
BeginThread(nil,128,@ChekIp,self,0,h);
ChekIp := TThread.Create(false);

end;


все работает, но вылетает ошибка когда закрываю прогу....
вот исходник, что я там не так сделал????
у меня уже голова кругом идет ((((( smile
PM MAIL   Вверх
Демо
Дата 16.1.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Можешь использовать как шаблон для реализации своего потока вот этот код:


Код

{
Модуль uGetHTTPThread
Выполнение запроса HTTP GET в отдельном потоке с
возможностью повторного использования.
Ведется учет количества потоков

Требования - установленный Indy10

 (c) Демо

Специально для Sources.ru (2005)

Пример использования:

procedure TForm1.Button1ClickSender: TObject);
var
  s: String;
begin
  with TGetHTTP.Create do
  begin
    OnComplete := Complete;
    Get('http://www.sources.ru');
  end;
  with TGetHTTP.Create do
  begin
    OnComplete := Complete;
    Get('http://localhost');
  end;

procedure TForm1.Complete(Sender: TGetHTTP; var Action: TActionHTTPThread);
begin
  Memo1.Lines.Add('Complete');
  Memo1.Lines.Add(Sender.Result.RecvStr);
  Action := ahFree;
end;

}
unit uGetHttpThread;

interface

uses
  windows,classes, SysUtils, idHTTP, idLogDebug, idComponent, idGlobal,IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack,  IdIntercept,idException;

var
  ThrList: TThreadList;

type

//Состояние потока
  TStateHTTPThread=(shNone,shReady,shComplete,shWork);
//Действие при обработке OnComplete
  TActionHTTPThread=(ahNone,ahFree);
  TGetHTTP=class;
  TCompleteQuery=procedure(Sender: TGetHTTP; var Action:TActionHTTPThread) of Object;
  TProgressQuery=procedure(Sender: TGetHTTP; aReadCount,aSendCount: Integer) of Object;

//Структура, заполняемая в потоке.
  THTTPRec=record
    Query: String;              //Запрос в виде http://url
    ErrorMsg: String;           //Результатт в текстовом виде
    ErrorCode: Integer;         //Результат в числовом виде
    RecvStr: String;            //Принятая строка(полностью с заголовком)
    SendStr: String;            //Отосланная строка
    CountSend: Integer;         //Количество отосланных байт
    CountRcv: Integer;          //Количество принятых байт
    Page: String;               //Возвращенная страница(без заголовка)
  end;

//Собственно, сам поток
  TGetHTTP=class(TThread)
  private
    FCS: RTL_CRITICAL_SECTION;
    FH: TidHTTP;
    FL: TidLogDebug;
    FS: TIdIOHandlerStack;
    FTimeOut: Integer;
    FQuery: String;
    FResult: THTTPRec;
    FState: TStateHTTPThread;
    FOnComplete: TCompleteQuery;
    FOnProgress: TProgressQuery;
    procedure FComplete;
    procedure FProgress;
    procedure FHWork(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Integer);
    procedure FLReceive(ASender: TIdConnectionIntercept;
      var ABuffer: TBytes);
    procedure FLSend(ASender: TIdConnectionIntercept;
      var ABuffer: TBytes);
    function GetTimeOut: Integer;
    procedure SetTimeOut(const Value: Integer);

    procedure Lock;
    procedure Unlock;
    function GetFResult: THTTPRec;
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Free;
    procedure Release;

    procedure Get(const Query: String);

    property OnComplete: TCompleteQuery read FOnComplete write FOnComplete;
    property OnProgress: TProgressQuery read FOnProgress write FOnProgress;
    property Result: THTTPRec read GetFResult;
    property State: TStateHTTPThread read FState;
    property TimeOut: Integer read GetTimeOut write SetTimeOut;
  end;

//Получение максимального количества потоков
function GetMaxThreads: Integer;

//Установка максимального количества потоков
procedure SetMaxThreads(aMaxThreads: Integer=10);

//завершение всех потоков и очистка списка
procedure TerminateAllThreads;

//Завершение конкретного потока
procedure ReleaseThread(Thread:TGetHTTP);

//Получение количества потоков в списке
function CheckCountThreads: Integer;

implementation

var
//Максимальное количество потоков - недоступно из других модулей напрямую
  MaxThreads: Integer;

{ TGetHTTP }

constructor TGetHTTP.Create;
begin
  if CheckCountThreads=GetMaxThreads then raise Exception.Create('Can''t create thread. MaxThreads='+IntToStr(MaxThreads));
  inherited Create(True);
  FreeOnTerminate := False;
  FState := shNone;             //Поток еще не готов принять запрос
  with ThrList.LockList do      //Добавляем поток в список
  try
    Add(Self);
  finally
    ThrList.UnlockList;
  end;
  TimeOut := 30000;
  InitializeCriticalSection(FCS);
  Resume;
end;

destructor TGetHTTP.Destroy;
begin
  FH.Free;
  FS.Free;
  FL.Free;
  DeleteCriticalSection(FCS);
end;

procedure TGetHTTP.Execute;
begin
  FH := TidHTTP.Create(nil);
  FL := TidLogDebug.Create(nil);
  FS := TIdIOHandlerStack.Create(nil);
  FS.Intercept := FL;
  FH.IOHandler := FS;
  FL.Active := True;
  FH.OnWork := FHWork;
  FL.OnReceive := FLReceive;
  FL.OnSend := FLSend;
  FState := shReady;
  if FQuery='' then Suspend;    //Запрос пустой - засыпаем
  try
    while not Terminated do
    begin
      FState := shWork;           //Поток занят
      FResult.Query := FQuery;
      FResult.ErrorMsg := '';
      FResult.ErrorCode := 0;
      FResult.RecvStr := '';
      FResult.SendStr := '';
      FResult.CountSend := 0;
      FResult.CountRcv := 0;
      FResult.Page := '';
      FQuery := '';

      try
        FH.ReadTimeout := TimeOut;       //Таймаут
        FResult.Page := FH.Get(FResult.Query);
        FResult.ErrorMsg := FH.ResponseText;
        FResult.ErrorCode := FH.ResponseCode;
      except
        on e: Exception do
        begin
          FResult.ErrorMsg := e.Message;
          FResult.ErrorCode := -1;
        end;
      end;
      FState := shComplete;       //Поток закончил выполнение запроса
      Synchronize(FComplete);     //Сообщаем пользователю
      if not Terminated then Suspend;
    end;
  finally
    ReleaseThread(Self);
  end;
end;

procedure TGetHTTP.FComplete;
var
  Action: TActionHTTPThread;
begin
  Action := ahNone;
  if Assigned(FOnComplete) then FOnComplete(Self,Action);
  if Action = ahFree
    then  Terminate;//ReleaseThread(Self)    //Завершаем поток
//    else Suspend;               //Засыпаем снова - до следующего запроса
end;

procedure TGetHTTP.FHWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
//Увеличиваем соответствующий счетчик
  Lock;
  try
    case AWorkMode of
      wmRead: FResult.CountRcv := FResult.CountRcv + AWorkCount;
      wmWrite: FResult.CountSend := FResult.CountSend + AWorkCount;
    end;
  finally
    Unlock;
  end;
  Synchronize(FProgress);
end;

procedure TGetHTTP.FLReceive(ASender: TIdConnectionIntercept;
  var ABuffer: TBytes);
var
  s: String;
begin
//  Добавляем в буфер полученную информацию
  SetLength(s,Length(ABuffer));
  Move(ABuffer[0],s[1],Length(ABuffer));
  FResult.RecvStr := FResult.RecvStr + s;
end;

procedure TGetHTTP.FLSend(ASender: TIdConnectionIntercept;
  var ABuffer: TBytes);
var
  s: String;
begin
//  Добавляем в буфер отправленную информацию
  SetLength(s,Length(ABuffer));
  Move(ABuffer[1],s[1],Length(ABuffer));
  FResult.SendStr := FResult.SendStr + s;
end;

procedure TGetHTTP.Free;
begin
//заменяем процедуру Free на нашу
  Release;
end;

procedure TGetHTTP.Get(const Query: String);
var
  i: Integer;
begin
//Проверяем, закончена ли предыдущая обработка.
  if (FState=shComplete) or (FState=shWork)
    then raise Exception.Create('Error state thread');

//Если поток еще только стартует - ожидаем.
  i := 100;
  while FState<>shReady do
  begin
    Sleep(10);
    //Слишком долго поток не переходит в статус shReady
    if i<0 then raise Exception.Create('Unknown error');
    Dec(i,10);
  end;
  FQuery := Query;
//Будим поток для выполнения запроса
  Resume;
end;

function TGetHTTP.GetTimeOut: Integer;
begin
  Result := InterlockedExchange(FTimeOut,FTimeOut);
end;

procedure TGetHTTP.SetTimeOut(const Value: Integer);
begin
  InterlockedExchange(FTimeOut,Value);
end;

procedure TGetHTTP.Release;
begin
  FreeOnTerminate := True;      //Переводим в состояние автоуничтожения
  Terminate;                    //Взводим флаг Terminated
  Resume;                       //Будим поток для завершения
end;

procedure TerminateAllThreads;
var
  i: Integer;
begin
  with ThrList.LockList do
  try
    for i := 0 to Count-1 do
    begin
      try
        TGetHTTP(Items[i]).Release;
      except
      end;
    end;
  finally
    ThrList.UnlockList;
  end;
end;

//Получить максимальное количество потоков.
function GetMaxThreads: Integer;
begin
  Result := InterlockedExchange(MaxThreads,MaxThreads);
end;

//Установить максимальное количество потоков.
procedure SetMaxThreads(aMaxThreads: Integer=10);
var
  CurrValue: Integer;
begin
  CurrValue := InterlockedExchange(MaxThreads,MaxThreads);
  if CurrValue>aMaxThreads then
  InterlockedExchange(MaxThreads,aMaxThreads);
end;

//Получить теккущее количество потоков
function CheckCountThreads: Integer;
begin
  with ThrList.LockList do
  try
    Result := Count;
  finally
    ThrList.UnlockList;
  end;
end;

//Завершить поток
procedure ReleaseThread(Thread:TGetHTTP);
var
  i:Integer;
begin
  with ThrList.LockList do
  try
    for i := 0 to Count-1 do
    begin
      try
        if TGetHTTP(Items[i])=Thread then
        begin
          TGetHTTP(Items[i]).Free;
          Delete(i);
          break;
        end;
      except
      end;
    end;
  finally
    ThrList.UnlockList;
  end;
end;

procedure TGetHTTP.Lock;
begin
  EnterCriticalSection(FCS);
end;

procedure TGetHTTP.Unlock;
begin
  LeaveCriticalSection(FCS);
end;


procedure TGetHTTP.FProgress;
var
  r,s: Integer;
begin
  if Assigned(FOnProgress) then
  begin
    Lock;
    try
      r := FResult.CountRcv;
      s := FResult.CountSend;
    finally
      Unlock;
    end;
    FOnProgress(Self,r,s);
  end;
end;

function TGetHTTP.GetFResult: THTTPRec;
begin
  Lock;
  try
    Result := FResult;
  finally
    Unlock;
  end;
end;

initialization
  MaxThreads := 10;
  ThrList := TThreadList.Create;
finalization
  TerminateAllThreads;
  ThrList.Free;
end.



Пример использования:

Код

unit ufMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdIntercept, IdLogBase, IdLogDebug, idGlobal,
  IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, uGetHttpThread,
  IdTelnet, IdMessageCoder, IdMessageCoderMIME;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IH: TIdHTTP;
    IL: TIdLogDebug;
    Memo1: TMemo;
    IdIOHandlerStack1: TIdIOHandlerStack;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ILReceive(ASender: TIdConnectionIntercept;
      var ABuffer: TBytes);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure Complete(Sender: TGetHTTP; var Action:TActionHTTPThread);
    procedure Progress(Sender: TGetHTTP; aReadCount,aSendCount: Integer);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TGetHTTP.Create do
  begin
    OnComplete := Complete;
    OnProgress := Progress;
    Get('http://www.rambler.ru');
  end;
end;

procedure TForm1.Complete(Sender: TGetHTTP; var Action: TActionHTTPThread);
begin
  Memo1.Lines.Add('Complete');
//  Memo1.Lines.Add(Sender.Result.RecvStr);
  Memo1.Lines.Add('Всего принято: '+IntToStr(Sender.Result.CountRcv));
  Memo1.Lines.Add('Всего отправлено: '+IntToStr(Sender.Result.CountSend));
  Action := ahFree;
end;

procedure TForm1.ILReceive(ASender: TIdConnectionIntercept;
  var ABuffer: TBytes);
var
  s: String;
begin
  SetLength(s,Length(ABuffer));
  Move(ABuffer[1],s[1],Length(ABuffer));
  Memo1.Lines.Add(s);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Add(IntToStr(CheckCountThreads));
end;

procedure TForm1.Progress(Sender: TGetHTTP; aReadCount,
  aSendCount: Integer);
begin
  Memo1.Lines.Add('Принято: '+IntToStr(aReadCount)+' / Отправлено: '+IntToStr(aSendCount));
end;

end.



Заодно можешь вот этот топик почитать:

http://forum.sources.ru/index.php?showtopic=120033


--------------------
    
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 16.1.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата

ChekIp := TThread.Create(false);

так делать нельзя класс TThread абстрактный нужно делать наследдника и прекрыть execute
вот пример:
Код

  TWorkThread = Class(TThread)
                 public
                   Procedure test;
                 protected
                   procedure Execute; override;
  end;


код ChekIp поместить в Execute
а вот это

Цитата

BeginThread(nil,128,@ChekIp,self,0,h);
ChekIp := TThread.Create(false);


создает целых два потока различными методами


Это сообщение отредактировал(а) alexeis1 - 16.1.2006, 15:32


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

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

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


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата(Barovskiy @ 16.1.2006, 13:08 Найти цитируемый пост)

И еще вопрос - как сделать не один поток а несколько??? к примеру 10
чтоб за один раз создавало 10 отдельных потоков?

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Barovskiy
Дата 16.1.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Демо @ 16.1.2006, 15:22 Найти цитируемый пост)

Можешь использовать как шаблон для реализации своего потока вот этот код:

Спасибо, буду разбираться

Цитата(alexeis1 @ 16.1.2006, 15:29 Найти цитируемый пост)

так делать нельзя класс TThread абстрактный нужно делать наследдника и прекрыть execute
вот пример:


у меня в примере нету этого .... все равно вылетает ...


Как вот мне мой код оптимизировать чтоб нормально было ... и потоков много было ....
мне мой код ктонибуль может показать что исправить по конкретнее....
Добавлено @ 15:51
Цитата(Albinos_x @ 16.1.2006, 15:35 Найти цитируемый пост)

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

так и есть .... читаю одну строку ... а остальные просто рушаться... и опять ошибка...

может менять порты при создании трейда????
PM MAIL   Вверх
Демо
Дата 16.1.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Barovskiy

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


--------------------
    
PM MAIL ICQ Skype   Вверх
Barovskiy
Дата 16.1.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Демо
Цитата(Демо @ 16.1.2006, 16:17 Найти цитируемый пост)

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


Вот функиции
Код


function GetLocalIP: String;
const WSVer = $101;
var
  wsaData: TWSAData;
  P: PHostEnt;
  Buf: array [0..127] of Char;
begin
  Result := '';
  if WSAStartup(WSVer, wsaData) = 0 then begin
    if GetHostName(@Buf, 128) = 0 then begin
      P := GetHostByName(@Buf);
      if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
    end;
    WSACleanup;
  end;
end;

function IPAddrToName(IPAddr : string): string;
var
  SockAddrIn: TSockAddrIn;
  HostEnt: PHostEnt;
  WSAData: TWSAData;
begin
  WSAStartup($101, WSAData);
  SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(IPAddr));
  HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
  if HostEnt <> nil then
    result := StrPas(Hostent^.h_name)
  else
    result:='';
end;


а вот что в цикле

Код


try
 Form1.edit5.Text := Copy (Form1.edit3.Text, 1, Pos ('', s[i]) - 1);
...
   Memo1.Lines.Add(IPAddrToName( Form1.edit5.Text));
...





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


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата(Barovskiy @ 16.1.2006, 15:47 Найти цитируемый пост)

может менять порты при создании трейда????

тогда без Class(TThread) и синхронизации не обойтись


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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