Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточное обращение к 1С, перегрузка ЦП, Проблема с перегрузкой процессора 
:(
    Опции темы
gregson
Дата 2.7.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Доброго дня всем!

В Дельфи я далеко не мастер, ничего профессионального не писал, однако для себя лет 5 пишу некоторые вещи. Столкнулся с проблемой при написании простенького на мой взгляд сервера.

Писалось все на Delphi 7 с использованием встроенного Indy. Простая форма, на ней Indy TCP Server и Memo для вывода логов. Вся основная обработка идет в процедуре OnExecute.

Через некоторое время после запуска сервера я обнаружил что процессор загружен на 50 процентов, еще через час на 97%. Понаблюдав логи стало понятно, что проц начинает грузиться когда подключаются несколько клиентов. Пока думаю на CoInitializeEx но что с этим делать не представляю.

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


Код

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  i,j,f,r,o,q: integer;
  res, sCommand, orderinfo, orderslist, curorder: String;
  a,login,pass,incommand: String;
  c: char;
  v77: Olevariant;
  msg,onlineinfo,params:string;
  b:byte;
  len,offlineinfo:Integer;
begin

with AThread.Connection do begin
try
  i := AThread.Connection.ReadInteger();
  Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' '+InttoStr(i));
  if ((i<1) or (i>16384)) then i:=-1;
  sCommand := AThread.Connection.ReadString(i);
  Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' '+sCommand);
  f:=0;
  login:='';
  pass:='';
  incommand:='';
  Params:='';
  for j := 1 to Length(sCommand) do Begin
     c:=sCommand[j];
     if c=' ' then f:=3;
     if c='#' then f:=f+1
      else
      begin
       if f=0 then login:=Login+c
       else if f=1 then pass:=pass+c
       else if f=2 then incommand:=incommand+c
       else if f=3 then params:=params+c;
      end;

  End;
  Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' LOGIN:'+Login);
  Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' PASSWORD:'+PASS);
  Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' COMMAND:'+incommand);
  Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' PARAMS:'+Params);


  if incommand='ONLINE' then
  begin
    CoInitializeEx (NIL, 2);
    v77 := createoleobject('v77s.application');

    if v77.Initialize(v77.rmtrade,'/D'+BasePath+' /N'+Login+' /P'+Pass, 'NO_SPLASH_SHOW') = 0 then
     Begin
      Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' OLE ERROR');
      Msg:='ERROR !!!!';
      Athread.Connection.OpenWriteBuffer();
      AThread.Connection.WriteInteger(length(Msg));
      AThread.Connection.Write(Msg);
      AThread.Connection.FlushWriteBuffer();
     End
     else
     begin
      Onlineinfo:=v77.EvalExpr('ID("'+trim(login)+'","'+trim(pass)+'")');
      if Onlineinfo='1' then
      begin
      Athread.Connection.OpenWriteBuffer();
      AThread.Connection.WriteInteger(length('CURRENTSTATUS '+currentstatus));
      AThread.Connection.Write('CURRENTSTATUS '+currentstatus);
      Msg := 'STATUS 2';
      Len := Length(Msg);
      Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' Writing...'+IntToStr(Length(Msg))+'   '+Msg);
      AThread.Connection.WriteInteger(length(Msg));
      AThread.Connection.Write(Msg);
      AThread.Connection.FlushWriteBuffer();
      end
      else
      begin
      Athread.Connection.OpenWriteBuffer();
      Msg := 'Error '+Onlineinfo;
      Len := Length(Msg);
      Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' Writing...'+IntToStr(Length(Msg))+'   '+Msg);
      AThread.Connection.WriteInteger(length(Msg));
      AThread.Connection.Write(Msg);
      AThread.Connection.FlushWriteBuffer();
      end;
   end;
end;

  try
    CoUnInitialize;
  except

  end;

    except
      on e: exception do
      begin

      end;
    end;
end;
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
Athread.Destroy;
end;



Это сообщение отредактировал(а) Rrader - 4.7.2009, 17:45
PM MAIL   Вверх
V0LT
Дата 3.7.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.6.2009

Репутация: нет
Всего: 2



Да у вас небольшая ошибка ... возможно причина в этом 
Код
 v77 := createoleobject('v77s.application');
 Вы создали ... а как же отчистить ??? 

Добавте:  
Код
v77 := Unassigned;
 Должно помочь smile 
Можете попробовать внешнюю компоненту написать ... если конечно влазить в код возможно ... обязательно загрузив её в конфигурации в глобальном модуле - и уже по ней определять что и как это сэкономит память и проц ... а OLE это очень громоздко
Ах да ... ещё забыл добавить ... если вам приспичит сделать в компоненте (в DLL) поток ... могу скинуть в личку проект Турникет (самодельная СКУД для управлением турникета + внешняя компонента для 1C)

Это сообщение отредактировал(а) V0LT - 3.7.2009, 22:57
PM MAIL ICQ   Вверх
gregson
Дата 3.7.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Спасибо за указание на ошибку. К сожалению на данный момент сроки настолько поджимают, что мне просто некогда будет посмотреть вашу софтину. Освобождение переменной v77 не решило проблему, однако натолкнуло меня на правильную мысль и я четко отловил момент когда начинается перегрузка процессора. При некорректном завершении работы со стороны клиента, например если у него внезапно пропал доступ в интернет, по идее мое приложение в этот момент обрабытывает либо:

Код

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
Athread.Destroy;
end;


Либо:

Код

procedure TForm1.IdTCPServer1Exception(AThread: TIdPeerThread;
  AException: Exception);
begin
WriteLn(flog,memo1.lines.text);
CloseFile(FLog);
Memo1.Lines.Add(DateToStr(Date())+' '+TimeToStr(Time())+' Connection reseted');
Athread.Destroy;
end;


Но что то не так, thread не убивается полностью.


M
Rrader
gregson, пользуйтесь подсветкой кода!


Это сообщение отредактировал(а) Rrader - 4.7.2009, 17:45
PM MAIL   Вверх
V0LT
Дата 4.7.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.6.2009

Репутация: нет
Всего: 2



Посмотрите соседнюю тему http://forum.vingrad.ru/forum/topic-161329...y1181102/0.html

Это сообщение отредактировал(а) V0LT - 4.7.2009, 09:02
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.