Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.18;
Скачать: CL | DM;

Вниз

потоки   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2008-04-17 18:51) [120]

> Palladin  (17.04.2008 18:37:57)  [117]

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


 
Palladin ©   (2008-04-17 19:05) [121]


> Аврам   (17.04.08 18:46) [119]

ну это например....
Грегори Р. Эндрюс
Основы многопоточного, параллельного и распределенного программирования
http://www.ozon.ru/context/detail/id/1372271/

и конечно же Рихтера, Создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows


> Anatoly Podgoretsky ©   (17.04.08 18:51) [120]

:) дык, а я о чем...


 
Оригинал   (2008-04-17 19:06) [122]


> Palladin ©   (17.04.08 18:40) [118]
>
> > Аврам   (17.04.08 18:36) [116]
>
> это не поможет, get будет висеть пока не получит все данные
> по запросу.


В Indy TidHTTP позволяет прерывать получение данных с сервера.


 
Palladin ©   (2008-04-17 19:13) [123]


> Оригинал   (17.04.08 19:06) [122]

пример в студию


 
ANB   (2008-04-17 19:16) [124]


> В Indy TidHTTP позволяет прерывать получение данных с сервера.

Это умеет делать даже TWebBrowser


 
Оригинал   (2008-04-17 19:18) [125]


> Palladin ©   (17.04.08 19:13) [123]
>
> > Оригинал   (17.04.08 19:06) [122]
>
> пример в студию


Даже и примера нет необходимости приводить.
Закрывается сокет во время работы, обрабатывается исключение и всё.


 
Оригинал   (2008-04-17 19:44) [126]

Хотя - пожалуйста. Вот пример:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent,
 IdComponent, IdTCPConnection, IdTCPClient, IdHTTP ;

type

 TIH=class(TThread)
 private
   FURL: String;
   FH: TIdHTTP;
 protected
   procedure Execute; override;
 public
   constructor Create(URL: String);
   property H: TIdHTTP read FH write FH;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   IH: TIdHTTP;
   IdAntiFreeze1: TIdAntiFreeze;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 H: TIH;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 s: String;
begin
 Timer1.Enabled := True;
 H := TIH.Create("http://10.74.1.35/hp/device/this.LCDispatcher?nav=hp.Usage");
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 H.FH.Socket.Close;
 Timer1.Enabled := False;
end;

{ TIH }

constructor TIH.Create(URL: String);
begin
 inherited Create(True);
 FUrl := URL;
 FreeOnTerminate := True;
 Resume;
end;

procedure TIH.Execute;
begin
 FH := TIdHTTP.Create(nil);
 try
   try
     FH.Get(FURL);
   except
     ON E: Exception do MessageBox(0,PChar(E.Message),PChar(E.Message),MB_OK);
   end;
 finally
   FH.Free;
 end;
end;

end.


 
Palladin ©   (2008-04-17 19:51) [127]


>ANB(17.04.08 19:16) [124]

предлагаешь использовать TWebBrowser в качестве транспорта... как все запущено...


>Оригинал (17.04.08 19:44) [126]


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


 
Anatoly Podgoretsky ©   (2008-04-17 20:30) [128]

> Palladin  (17.04.2008 19:05:01)  [121]

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


 
Anatoly Podgoretsky ©   (2008-04-17 20:32) [129]

> Palladin  (17.04.2008 19:51:07)  [127]

А я посмотрю как это удастся, без внешнего воздействия.


 
Palladin ©   (2008-04-17 21:01) [130]

интересно, а Анатоль знает, что он во сне разговаривает, а его мощнейший разум  проецирует поток сознания прямо на форум... :)


 
Anatoly Podgoretsky ©   (2008-04-17 21:24) [131]

> Palladin  (17.04.2008 21:01:10)  [130]

Это что уже заметно?


 
Anatoly Podgoretsky ©   (2008-04-17 21:25) [132]

> Palladin  (17.04.2008 21:01:10)  [130]

И вообще почему ты решил, что я сплю?


 
ЦУП ©   (2008-04-17 21:59) [133]


> Palladin ©   (17.04.08 19:51) [127]
>Оригинал (17.
> 04.08 19:44) [126]а теперь поиграем в 10 отличий исключения
> в следствии закрытия сокета вручную и другого возникшего
> из-за реального закрытия в следствие системной ошибки...
>


А теперь в качестве домашнего задания подумаем и решим, как это сделать. Маленькая подсказка - создаём в классе метод и...


 
MetalFan ©   (2008-04-18 00:36) [134]


> Оригинал   (17.04.08 19:44) [126]

зря время на написание примера тратили.
можно посмотреть реализацию обработки TIdHttp.ConnectionTimeout
там как раз нечто подобное и сделано.


 
Оригинал   (2008-04-18 01:15) [135]


> MetalFan ©   (18.04.08 00:36) [134]
> > Оригинал   (17.04.08 19:44) [126]зря время на написание
> примера тратили.можно посмотреть реализацию обработки TIdHttp.
> ConnectionTimeoutтам как раз нечто подобное и сделано.


Если ты мне скажешь конкретное название файла, в котором находится реализация - я посмотрю. Ок?


 
Palladin ©   (2008-04-18 10:01) [136]


> ЦУП ©   (17.04.08 21:59) [133]

это ты ребенку своему домашние задания будешь давать

давай, помогай по полной. в каком классе? какой метод? зачем он там нужен? я автору уже помог, теперь, раз ты вызвался, до конца завершай начатое...


 
ANB   (2008-04-18 10:20) [137]


> >ANB(17.04.08 19:16) [124]
>
> предлагаешь использовать TWebBrowser в качестве транспорта.
> .. как все запущено...

Я бы постарался вообще не использовать HTTP в качестве транспорта.

Во всяком случае использование Синхронизе для передачи информации о ходе выполнения в основной поток вместо посылки сообщения - это не меньшая запущенность.

ИМХА :
Потоки надо начинать использовать только если все прочие методы ускорения процесса уже использованы. Далее, перед их использованием неплохо было бы оценить - а действительно ли это даст ускорение, не забывая, что количество процессоров на рабочей станции невелико.
Если  все же принято решение о распараллеливании, то необходимо качественно изучить эту тему и все грабли с ней связанные. А грабли не только в правильном и неправильном использовании Синхронизе.

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


 
Palladin ©   (2008-04-18 10:28) [138]


> Оригинал   (18.04.08 01:15) [135]

IdIOHandlerStack.pas


 
Palladin ©   (2008-04-18 10:50) [139]


> Я бы постарался вообще не использовать HTTP в качестве транспорта.

чем http отличается от не http в плане соединения/отправки/получения/разъединения?


> Во всяком случае использование Синхронизе для передачи информации
> о ходе выполнения в основной поток вместо посылки сообщения
> - это не меньшая запущенность.

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

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


 
Оригинал   (2008-04-18 11:05) [140]


> Palladin ©   (18.04.08 10:01) [136]
>
> > ЦУП ©   (17.04.08 21:59) [133]
>
> это ты ребенку своему домашние задания будешь давать


I>
> Palladin ©   (17.04.08 19:51) [127]
> >Оригинал (17.04.08 19:44) [126]
>
>
> а теперь поиграем в 10 отличий исключения в следствии закрытия
> сокета вручную и другого возникшего из-за реального закрытия
> в следствие системной ошибки...


Обороты сбавь. Хорошо? играй с детьми своими, если они у тебя есть.

Теперь по твоему вопросу как отличить исключение искусственное от любого другого в приведенном примере.
Задачка-то ведь совсем простая. Для этого буквы писать надо?

1. В приведенном поточном классе добавляем метод, например Break
2. Добавляем boolean-флаг в private-секцию, изначально = False.
3. Вместо внешнего обращения к IdHTTP обращаемся к методу, который выставляет флаг и закрывает сокет.
4. При возникновении исключения проверяем флаг.
5. Всё.

Код с минимальными изменениями:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, IdBaseComponent,
 IdComponent, IdTCPConnection, IdTCPClient, IdHTTP ;

type

 TIH=class(TThread)
 private
   FURL: String;
   FH: TIdHTTP;
   FIsBreak: Boolean;
 protected
   procedure Execute; override;
 public
   constructor Create(URL: String);
   procedure Break;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 H: TIH;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 H := TIH.Create("http://10.74.1.35/hp/device/this.LCDispatcher?nav=hp.Usage");
 Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 H.Break;
 Timer1.Enabled := False;
end;

{ TIH }

procedure TIH.Break;
begin
 if Assigned(FH) then
 begin
   FIsBreak := True;
   FH.Socket.Close;
 end;
end;

constructor TIH.Create(URL: String);
begin
 inherited Create(True);
 FUrl := URL;
 FreeOnTerminate := True;
 FIsBreak := False;
 Resume;
end;

procedure TIH.Execute;
var
 s: String;
begin
 FH := TIdHTTP.Create(nil);
 try
   try
     FH.Get(FURL);
   except
     ON E: Exception do
     begin
       if FIsBreak then s := " Break connection" else s :="";
       MessageBox(0,PChar(E.Message+s),PChar(E.Message),MB_OK);
     end;
   end;
 finally
   FH.Free;
 end;
end;

end.



 
Оригинал   (2008-04-18 11:12) [141]


> Palladin ©   (18.04.08 10:28) [138]
>
> > Оригинал   (18.04.08 01:15) [135]
>
> IdIOHandlerStack.pas


Нет у меня такого файла-(
(BDS, indy10)


 
Palladin ©   (2008-04-18 11:16) [142]


> Оригинал   (18.04.08 11:05) [140]



> Обороты сбавь. Хорошо? играй с детьми своими, если они у
> тебя есть.

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

по поводу, кода: серьезных претензий нет. теперь много народу прочитает и узнает как прервать get в indy.


 
Palladin ©   (2008-04-18 11:17) [143]


> Оригинал   (18.04.08 11:12) [141]

должен быть. %INDY%\Source\Core\IdIOHandlerStack.pas


 
Оригинал   (2008-04-18 11:39) [144]


> Palladin ©   (18.04.08 11:16) [142]
>
> > Оригинал   (18.04.08 11:05) [140]
>
>
>
> > Обороты сбавь. Хорошо? играй с детьми своими, если они
> у
> > тебя есть.
>
> я чем то тебя оскорбил? тебе что то не нравится? вроде как
> бы не тебе адресовалось. играть с детьми я никому не предлагал,
>  а вот мне тут какое то вдруг домашнее задание давать начали.
>  так может быть обороты то не мне сбавить? а тебе вкурить
> ситуацию. и на личности переходить не будем.


Я ж тебе процитировал твои слова, где ты играть предлагал.
Ну да ладно. Замнем? Зачем разводить здесь ерунду.

У меня в Source в каталоге indy вообще нет подкаталогов. -(


 
Palladin ©   (2008-04-18 11:53) [145]


> Я ж тебе процитировал твои слова, где ты играть предлагал.

процитировал одно, а сказал другое, у меня нет ни слова про игры

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


> Замнем?

справедливость восстановлена, замнем


> У меня в Source в каталоге indy вообще нет подкаталогов

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


 procedure DoConnectTimeout(ATimeout: Integer);
 var
   LSleepTime: Integer;
   LInfinite: Boolean;
 begin
   if ATimeout = IdTimeoutDefault then begin
     ATimeout := IdTimeoutInfinite;
   end;
   LInfinite := ATimeout = IdTimeoutInfinite;
   with TIdConnectThread.Create(True) do try
     FBinding := Binding;
     Resume;
     // Sleep
     if TIdAntiFreezeBase.ShouldUse then begin
       LSleepTime := Min(GAntiFreeze.IdleTimeOut, 125);
     end else begin
       LSleepTime := 125;
     end;

     if LInfinite then begin
       ATimeout := LSleepTime + 1;
     end;

     while ATimeout > LSleepTime do begin
       IdGlobal.Sleep(LSleepTime);
       ATimeout := ATimeout - LSleepTime;

       if LInfinite then begin
         ATimeout := LSleepTime + 1;
       end;

       TIdAntiFreezeBase.DoProcess;
       if Terminated then begin
         ATimeout := 0;
         Break;
       end;
     end;
     IdGlobal.Sleep(ATimeout);
     //
     if Terminated then begin
       if FExceptionMessage <> "" then begin
         if FLastSocketError <> 0 then begin
           raise EIdSocketError.CreateError(FLastSocketError, FExceptionMessage);
         end;
         EIdConnectException.Toss(FExceptionMessage);
       end;
     end else begin
       Terminate;
       Close;
       WaitFor;
       EIdConnectTimeout.Toss(RSConnectTimeout);
     end;
   finally Free; end;
 end;

procedure TIdConnectThread.Execute;
begin
 try
   try
     FBinding.Connect;
   except
     on E: EIdSocketError do begin
       if (E.LastError <> Id_WSAEBADF) and (E.LastError <> Id_WSAENOTSOCK) then begin
         raise;
       end;
     end;
   end;
 except
   on E: Exception do begin
     FExceptionMessage := E.Message;
     if E is EIdSocketError then begin
       FLastSocketError := EIdSocketError(E).LastError;
     end;
   end;
 end;
 // Necessary as caller checks this
 Terminate;
end;


то есть, все банально, подключение в другом потоке...


 
ANB   (2008-04-18 15:49) [146]

to Palladin :

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

unit Unit1;

interface

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

type
 TMyThread = class(TThread)
 protected
   procedure Execute; override;
 public
   EditHandle : THandle;
 end;

 TForm1 = class(TForm)
   btnStart: TButton;
   btnStop: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   procedure btnStartClick(Sender: TObject);
   procedure btnStopClick(Sender: TObject);
   procedure Edit1KeyPress(Sender: TObject; var Key: Char);
 private
   { Private declarations }
 public
   { Public declarations }
   T1, T2, T3 : TMyThread;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.btnStartClick(Sender: TObject);
begin
 PostMessage(Edit1.Handle, WM_CHAR, 0, 0);
 PostMessage(Edit2.Handle, WM_CHAR, 0, 0);
 PostMessage(Edit3.Handle, WM_CHAR, 0, 0);
 T1 := TMyThread.Create(True);
 T2 := TMyThread.Create(True);
 T3 := TMyThread.Create(True);
 T1.FreeOnTerminate := True;
 T2.FreeOnTerminate := True;
 T3.FreeOnTerminate := True;
 T1.EditHandle := Edit1.Handle;
 T2.EditHandle := Edit2.Handle;
 T3.EditHandle := Edit3.Handle;
 T1.Resume;
 T2.Resume;
 T3.Resume;
end;

{ TMyThread }

procedure TMyThread.Execute;
var i : LongInt;
begin
 for i := 10 to 1000000 do begin
   if Terminated then begin
     PostMessage(EditHandle, WM_CHAR, 1, 0);
     Exit;
   end;
   PostMessage(EditHandle, WM_CHAR, i mod 256, 0);
   Sleep(100);
 end;
end;

procedure TForm1.btnStopClick(Sender: TObject);
begin
 T1.Terminate;
 T2.Terminate;
 T3.Terminate;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 with Sender as TEdit do begin
   Text := IntToStr(Byte(Key));
 end;
end;

end.



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2008.05.18;
Скачать: CL | DM;

Наверх




Память: 0.82 MB
Время: 0.038 c
2-1208676926
Necromancer13
2008-04-20 11:35
2008.05.18
UNION в Паскале


4-1188932225
Rubi
2007-09-04 22:57
2008.05.18
Перехват сообщений


2-1208335672
Armond
2008-04-16 12:47
2008.05.18
Запрос


4-1188899278
Cj
2007-09-04 13:47
2008.05.18
Regedit DDE


15-1207128130
kiberg
2008-04-02 13:22
2008.05.18
список замен