Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Правильно ли работаю с потоками? [D7, XP]


Страницы:   1 2 3 4 5

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
:)


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо