Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL на Delphi Embarcadero, IIS, многопоточность, р, DLL на Delphi Embarcadero, IIS, многопот 
:(
    Опции темы
forSale
  Дата 20.4.2014, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть код:
   
Код

 { Invokable implementation File for TBillingGaz which implements IBillingGaz }
    
    unit BillingGazImpl;
    
    interface
    
    uses InvokeRegistry, Types, XSBuiltIns, BillingGazIntf, WebService.ReturnRecord,
         Classes, SyncObjs, SysUtils, StrUtils, Messages;
    
    type
    
      { TBillingGaz }
      TBillingGaz = class(TInvokableClass, IBillingGaz)
      public
        function echoDouble(const Value: Double): Double; stdcall;
        function GetBill(const AccountNo: string; const ConsumValue: Integer): TBillForClient; stdcall;
      end;
    
    
    type
      TNThread = class(TThread)
      private
        FAcc : string;
        FCons : Integer;
        procedure Sync;
      protected
        procedure Execute; override;
      public
        property AccTh : string read FAcc write FAcc;// write Fcons;
        property Cons : Integer read Fcons write Fcons;
      end;
    
    var
      acc: string;
      cons1, i: Integer;
      CS: TCriticalSection;
      mBillingGaz : TBillingGaz;
    
    implementation
    
    uses WebService.CalcPayAmount{, BillingGazThread};
      
    
    function TBillingGaz.echoDouble(const Value: Double): Double; stdcall;
    begin
      { TODO : Implement method echoDouble }
      Result := Value;
    end;
    
    function TBillingGaz.GetBill(const AccountNo: string; const ConsumValue: Integer): TBillForClient; stdcall;
    var
      NewThread: TNThread;
      prevAcc : string;
    begin
      Result := TBillForClient.Create;
   
      cons1 := 0;
      acc :=  AccountNo;
      prevAcc := AccountNo;
      Result.FullName := acc + ' ' + FormatDateTime('hh:mm:ss.zzz', Now);
   
      NewThread:= TNThread.Create(true);
      NewThread.FreeOnTerminate:=true;
      NewThread.Priority:=tpLower;
      NewThread.AccTh := prevAcc;
      NewThread.Resume;
      Sleep(5);
   
      if Copy(Result.FullName, 1, 9) <> acc then
        Result.FullName := Result.FullName + ' ' + acc + ' ' + prevAcc;
      Result.ErrorCode := NewThread.Cons;
    end;
    
    
    procedure TNThread.Execute;
    begin
      CS.Enter;
      case AnsiIndexText(Copy(AccTh, 1, 2), ['00','01','02','03','04','05']) of
        0 : begin
          Cons := 1;
        end;
        1 : begin
          Cons := 2;
        end;
        2 : begin
          Cons := 3;
        end;
        3 : begin
          Cons := 4;
        end;
        4 : begin
          Cons := 5;
        end;
        5 : begin
          Cons := 6;
        end
      else
        Cons := ERROR_WRONG_ACCOUNT_NO;
      CS.Leave;
    end;
    
    procedure TNThread.Sync;
    begin
    //  mBillingGaz.Billingcons := cons1;
    end;
    
    
    initialization
    { Invokable classes must be registered }
       InvRegistry.RegisterInvokableClass(TBillingGaz);
       CS := TCriticalSection.Create;
    
    end.


Есть биллинговый проект. Он рабочий. Появилась необходимость создать веб-сервис для предоставления суммы к оплате за газ в ответ на запрос с передачей лицевого счета и текущего показания счетчика. Чтобы не изобретать велосипед, было решено взять готовый модуль проекта, отвечающий за расчеты и создать на его основе DLL для веб-сервера. Проведено тестирование сервиса: поочередно серверу передаются заранее заготовленные лицевые счета и показания, ответ выводится в МЕМО на клиенте. Это работает нормально, когда только один клиент обращается. Программа клиента была скопирована и запущена параллельно. Таким образом два клиента одновременно работают. У них 2 разных списка с лицевыми и показаниями. Обе программы работают какое-то время, потом появляется ошибка: List index out of bounds().
Порывшись в интернете обнаружил, что IIS работает в несколько потоков. А это чревато при работе с TList, который не потокобезопасен. При попытке перейти на TThreadList наткнулся на такую проблему: список на основе TList объявляется как:
var
  переменная: TList<какой-то класс>;

такая конструкция по-видимому TThreadList не поддерживается. Долго не заморочиваясь, решил создавать потоки прямо внутри удаленно вызываемой функции GetBill. Но тут наткнулся на проблему синхронизации. Бывает так, что запросы к серверу поступают одновременно и результат второго по очереди запроса попадает к первому.

Не удается организовать работу потоков. Что-то я делаю не так, возможно вообще в корне неверное, но не пойму как по-другому работать с потоками.
PM MAIL   Вверх
Romikgy
Дата 20.4.2014, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



ну так почитайте как правильно работать с многопоточностью в дельфи


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
forSale
Дата 21.4.2014, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Romikgy @  20.4.2014,  21:33 Найти цитируемый пост)
ну так почитайте как правильно работать с многопоточностью в дельфи 

Читаю. Честно. =)
Но там такой материал, что легче спросить как дальше быть.
PM MAIL   Вверх
Romikgy
Дата 22.4.2014, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



нет , не легче...
легче один раз самому разобраться , чем потом каждый раз спрашивать 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




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


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

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