![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильно ли работаю с потоками? [D7, XP]
Lamer6666 © (2011-07-26 23:27:00)Доброго времени суток уважаемые!
Решаю следующую задачу, по таймеру получаю методом GET информацию. Данную задачу необходимо реализовать в потоке. Делаю так:
Описал тип
type
TKdServerThread = class(TThread)
private
Procedure GetIn;
protected
procedure execute; override;
end;
Процедура исполнения:
Procedure TKdServerThread.execute;
begin
Synchronize(GetIn);
end;
Выполняю нужный мне код:
Procedure TKdServerThread.GetIn;
begin
Try
Form1.Memo1.Lines.Add(IdHTTP99.Get('....'));
Except
End;
Application.ProcessMessages;
end;
Далее по таймеру запускаю потоки:
procedure TForm1.Timer1Timer(Sender: TObject);
var NewThread: TKdServerThread;
begin
NewThread:=TKdServerThread.Create(true);
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpLowest;
NewThread.Resume;
end;
вопрос:
1. Правильно ли реализовано решение?
2. Что будет если один из потоков повиснет при выполнении метода GET, продолжат ли работу остальные потоки?
3. Как ограничить количество потоков, есть некий параметр показывающий кол-во работающих потоков, или нужно считать кол-во созданных потоков самому?
Огромное спасибо.
Германн (2011-07-27 02:02:00) [61]
> antonn © (27.07.11 01:55) [22]
>
>
> > Во-вторых пустая часть Except защищенного блока - единица
> > в дневнике!
>
> Вовсе нет, когда не важно какая ошибка там будет, главное
> чтобы в потоке не решило появится окошко эксепшена (от этих
> вот raise я и перешел на синапс,
А когда не важно?
И что нам всем переходить на синапс?
antonn (2011-07-27 01:55:00) [62]
> Во-вторых пустая часть Except защищенного блока - единица
> в дневнике!
Вовсе нет, когда не важно какая ошибка там будет, главное чтобы в потоке не решило появится окошко эксепшена (от этих вот raise я и перешел на синапс, сделал операцию - проверил результат, а не городить эти блоки чтобы гасить эксепшн).
И особенно когда не сильно важно узнать что получилось в результате и не нужна гарантия выполнения - зачем мне знать что там приключилось?
Германн (2011-07-27 01:23:00) [63]
> Lamer6666 (27.07.11 01:15) [20]
>
> В общем как я понял, процедура execute выполняет все действия
> вычисления и записывает результат в параметр. Далее процедура
> Synchronize присваивает значение вышеуказанного параметра
> объекту главного процесса.
Теоретически правильно.
Lamer6666 (2011-07-27 01:15:00) [64]В общем как я понял, процедура execute выполняет все действия вычисления и записывает результат в параметр. Далее процедура Synchronize присваивает значение вышеуказанного параметра объекту главного процесса.
Lamer6666 (2011-07-27 00:58:00) [65]
> Нет. Не верно.
> Во-первых вызов процедуры Application.ProcessMessages в
> доппотоке не имеет никакого смысла.
> Во-вторых пустая часть Except защищенного блока - единица
> в дневнике!
> В-третьих. А чего записывать в Мемо, если Get не получился?
>
>
Согласен с Application.ProcessMessages. По поводу Except она будет заполнена, но речь пока не о ней, а о конструкции потока. Synchronize(Memo1UpDate); будет поднято в Try (не внимательность), а при неудаче сработает Except .
Procedure TKdServerThread.execute;
begin
Try
StrParam1:=IdHTTP99.Get('....');
Synchronize(Memo1UpDate);
Except
//код обработки исключительной ситуации
End;
end;
Германн (2011-07-27 00:54:00) [66]
> так верно?
>
Нет. Не верно.
Во-первых вызов процедуры Application.ProcessMessages в доппотоке не имеет никакого смысла.
Во-вторых пустая часть Except защищенного блока - единица в дневнике!
В-третьих. А чего записывать в Мемо, если Get не получился?
P.S.
В четвертых - не знаю Инди. Так что и не знаю как работает метод TIdHTTP.Get.
Lamer6666 (2011-07-27 00:54:00) [67]В ситуациях, когда некие действия могут вызвать существенную задержку в одном из потоков (например, ожидание ввода от пользователя), часто желательно, чтобы программа имела возможность осуществлять другие действия независимо (например, фоновую проверку орфографии или обработку входящих сетевых сообщений).
Вот я и думаю, что бы запросы обрабатывались в отдельном потоке, в то время можно было бы производить другие действия с основным приложением.
Игорь Шевченко (2011-07-27 00:48:00) [68]нафиг тебе вообще потоки ?
> http://compconnect.ru/2010/10/rabota-s-potokami-v-delphi-
> 7/
в топку такие примеры.
Хотя бы здесь почитай: http://forum.vingrad.ru/topic-60076.html
Германн (2011-07-27 00:46:00) [69]
> Lamer6666 (27.07.11 00:30) [12]
>
> Читаю внимательнее... Спасибо.
>
Там всё написано правильно. Только не по
Lamer6666 (2011-07-27 00:44:00) [70]Процедура исполнения:
Procedure TKdServerThread.execute;
begin
Try
StrParam1:=IdHTTP99.Get('....');
Application.ProcessMessages;
Except
End;
Synchronize(Memo1UpDate);
end;
Выполняю нужный мне код:
Procedure TKdServerThread.Memo1UpDate;
begin
Memo1.....:=StrParam1;
end;
так верно?
Lamer6666 (2011-07-27 00:43:00) [71]Процедура исполнения:
Procedure TKdServerThread.execute;
begin
Try
StrParam1:=IdHTTP99.Get('....');
Except
End;
Application.ProcessMessages;
Synchronize(Memo1UpDate);
end;
Выполняю нужный мне код:
Procedure TKdServerThread.Memo1UpDate;
begin
Memo1.....:=StrParam1;
end;
так верно?
Lamer6666 (2011-07-27 00:30:00) [72]Читаю внимательнее... Спасибо.
sniknik (2011-07-27 00:29:00) [73]> http://compconnect.ru/2010/10/rabota-s-potokami-v-delphi-7/
> :)
и правда врешь, т.к. там такого не написано, там все правильно.
> Народ дайте ссылку на правильный код
пожалуйста, вполне правильная ссылка
http://compconnect.ru/2010/10/rabota-s-potokami-v-delphi-7/
Lamer6666 (2011-07-27 00:24:00) [74]
> врешь небось? пруф где?
http://compconnect.ru/2010/10/rabota-s-potokami-v-delphi-7/
:)
Народ дайте ссылку на правильный код, для, так сказать детального изучения.
))
sniknik (2011-07-27 00:23:00) [75]> передавать "Сообщением"?
молнией! откуда выводы о не написаном?
sniknik (2011-07-27 00:21:00) [76]> Статейки нарыл в Интернет под заголовком "Работа с потоками"
врешь небось? пруф где?
Lamer6666 (2011-07-27 00:18:00) [77]Имеете ввиду что данные в основной поток надо передавать "Сообщением"?
Германн (2011-07-27 00:17:00) [78]
> А что в нем не так?
Процедура Execute.
Lamer6666 (2011-07-27 00:12:00) [79]Статейки нарыл в Интернет под заголовком "Работа с потоками"
:)
А что в нем не так?
Германн (2011-07-27 00:05:00) [80]
> Вот скажите мне, откуда этот код ?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1082
:)