Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];
Внизпотоки Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.8 MB
Время: 0.047 c