Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2016, 01:41   #1
vanam
 
Регистрация: 12.01.2009
Сообщений: 7
По умолчанию Потокобезопасность

Здравствуйте
Есть несколько потоков со своими HTTP: TidHTTP
Есть функция в отдельном модуле
Код:
function HTTPGet (HTTP: TidHTTP; url: string): string;
begin
...
try Result: = http.Get (url);
except on E: Exception do ... end;
...
end;
Безопасно ли выполнять эту функцию из потоков. Если нет, то почему?
vanam вне форума Ответить с цитированием
Старый 11.01.2016, 08:48   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да. Безопасно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.01.2016, 09:07   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Функции сетевых кличент-серверных запросов нужно выполнять в отдельных потоках.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.01.2016, 09:55   #4
vanam
 
Регистрация: 12.01.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да. Безопасно.
модуль-поток
Код:
unit unitHreadCategory;
type
  THreadCategory = class(TThread)
  private
    HTTP:TIdHTTP;
…
uses lib4parse;
…
procedure THreadCategory.Execute;
begin
…
  HTTP:=HTTPCreate();
HTTPGet(HTTP,url);
…
end;
модуль 2
Код:
unit lib4parse;
…
function HTTPGet (HTTP: TidHTTP; url: string): string;
begin
...
try Result: = http.Get (url);
except on E: Exception do ... end;
...
end;
при одном потоке все прекрасно работает
при нескольких потоках - потоки зависают на HTTPGet
vanam вне форума Ответить с цитированием
Старый 11.01.2016, 11:04   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
нужно выполнять в отдельных потоках.
ТС так и делает.
Цитата:
при нескольких потоках - потоки зависают на HTTPGet
Как выглядит полностью код потока и HTTPGet () ?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.01.2016, 13:32   #6
vanam
 
Регистрация: 12.01.2009
Сообщений: 7
По умолчанию

Код:
function HTTPGet (HTTP: TidHTTP; url: string): string;
begin
try Result: = http.Get (url);
except on E: Exception do end;
end;
Код:
unit unitHreadCategory;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IDHTTP, IdSSLOpenSSL, IdCookieManager,
  Vcl.Samples.Gauges, IdZLibCompressorBase, IdCompressorZLib, ActiveX, regExpr;
type
  THreadCategory = class(TThread)
  public
  private
    HTTP:TIdHTTP;
  protected
    procedure Execute; override;
  end;
implementation
uses unitPasrer, unitHreadCurrCategory, lib4parse;
procedure THreadCategory.Execute;
var page:string;
begin
 CoInitialize(nil);
 HTTP:=HTTPCreate('www.heureka.cz');
 page:=HTTPGet(HTTP, url);  
CoUnInitialize();
end;
end.
даже так при нескольких потоках не работает

Последний раз редактировалось vanam; 11.01.2016 в 13:36.
vanam вне форума Ответить с цитированием
Старый 11.01.2016, 13:58   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
CoInitialize(nil);
А это тут зачем??
Убери и это и CoUnInitialize. Они не для этих действий.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.01.2016, 16:28   #8
vanam
 
Регистрация: 12.01.2009
Сообщений: 7
По умолчанию

sorry
это не весь модуль-потока. там еще работа с регулярными выражениями...для них CoInitialize / CoUnInitialize
vanam вне форума Ответить с цитированием
Старый 11.01.2016, 16:54   #9
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Что значит не работает?
come-on вне форума Ответить с цитированием
Старый 11.01.2016, 17:02   #10
vanam
 
Регистрация: 12.01.2009
Сообщений: 7
По умолчанию

в IDE выскакивает окно отладки с assembler
без IDE - вроде все потоки умирают кроме одного
vanam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потокобезопасность lavilin C# (си шарп) 7 24.11.2014 10:17