Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточность и ib 
:(
    Опции темы
Алкоголик
Дата 30.3.2010, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здраствуйте.
Подкиньте пожалуйста пример многоточной програмки работающей с IB.
А то как не пробовал не получается.

Была однопоточная программа работала все хорошо. Только медленно где-то 150 тысяч нужных действий в сутки. Решил переделать её в многопоточную. Скачивание из инета файла/распознование его работает. А вот update отказывается делать. Пробовал по разному.. передавать строку sql в основной поток/ в потоках создавать IBDataset, IBTransaction, IBDataBase. Ничего не работает.

Заранее спасибо.
PM MAIL   Вверх
Deniz
Дата 31.3.2010, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Цитата(Алкоголик @  30.3.2010,  14:41 Найти цитируемый пост)
Ничего не работает.
а что не работает?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Alexeis
Дата 31.3.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Алкоголик @  30.3.2010,  11:41 Найти цитируемый пост)
Подкиньте пожалуйста пример многоточной програмки работающей с IB.

  А база данных какая? Какой протокол доступа? Ошибка какая?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Алкоголик
Дата 31.3.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



База Firebird 2.0, метод доступа думаю в листинге увидите. Ошибка не знаю какая, это моя первая попытка написать многопоточное приложение и как смотреть ошибку в потоке я еще не знаю.
Постарался лишнее удалить. Так как несколько раз переделывал, то где то могут остаться хвосты от предыдущих вариантов.

это код основной программы:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, JvExControls, JvAnimatedImage, JvGIFCtrl, ExtCtrls,
   WinInet, IBDatabase, DB, IBCustomDataSet, IBQuery, inifiles;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    JvGIFAnimator1: TJvGIFAnimator;
    Memo1: TMemo;
    IBD: TIBDatabase;
    IBTransaction1: TIBTransaction;
    Button2: TButton;
    IBTransaction2: TIBTransaction;
    IBQuery1: TIBQuery;
    IBQuery2: TIBQuery;
    Label1: TLabel;
    Image2: TImage;
    JvGIFAnimator2: TJvGIFAnimator;
    Read_Q: TIBQuery;
    Label2: TLabel;
    Edit1: TEdit;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    function GetDataI(SQL:String):Integer;
    Procedure CreateTemplate;
    Procedure updates(sss:string);

  private
    { Private declarations }
  public
    num : array [0..9, 0..4, 0..14] of integer; // массив образов
    IBQuerynovis: TIBQuery;
    { Public declarations }
  end;

var
  Form1: TForm1;
    ini:Tinifile;
    put:string;
    CntThreads:integer;
implementation

{$R *.dfm}
uses uticTheard;

................................................

procedure TForm1.Button1Click(Sender: TObject);
var
s,url:string;
i:integer;
boo:boolean;
th:TTicThread;
begin
  ibd.Connected:=true;
  ibquery1.SQL.Add('select DOMENRU from TICKA where tic030310 is NULL');
  ibquery1.Open;
  i:=0;
  SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_HIGHEST);
  while not ibquery1.EOF do
  begin

      try
        th := TTicThread.Create(true);
        SetThreadPriority(th.ThreadID, THREAD_PRIORITY_HIGHEST);
        th.Url := IBQuery1.fieldbyname('DOMENRU').AsString;
        th.form := self;
        th.Resume;
        sleep(100);
        Application.ProcessMessages;
        sleep(100);
      except
      end;
      ibquery1.Next;
  end;

    Inc(i);
    //if i mod 100=0 then begin

    Label1.Caption:=IntToSTR(i);
    Application.ProcessMessages;
    //end;
 // ibquery1.Next;
//end;
 ibquery1.Close;
 ibd.Connected:=false;

end;

............................
end.


это код потока:
Код

unit uTicTheard;

interface

uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, JvExControls, JvAnimatedImage, JvGIFCtrl, ExtCtrls,
   WinInet, unit1,, IBDatabase, DB, IBCustomDataSet, IBQuery;

type
  TTicThread = class(TThread)
  protected
    Procedure GetCY(xWidth, xHeight : integer; xBMP: TBitMap; var xNum : string);
    Procedure GetCX(xWidth, xHeight : integer; xBMP,x2BMP: TBitMap;  var flo : boolean);
    function GetInetFile(const fileURL, FileName: String): boolean;
    procedure Execute; override;
  public
    url:string;
    form: TForm1;
  end;

implementation

Procedure TTicThread.GetCY(xWidth, xHeight : integer; xBMP: TBitMap; var xNum : string);
begin
.........................
end;

Procedure TTicThread.GetCX(xWidth, xHeight : integer; xBMP,x2BMP: TBitMap;  var flo : boolean);

begin
........................
end;

function TTicThread.GetInetFile(const fileURL, FileName: String): boolean;
begin
..............................
end;

procedure TTicThread.Execute;
var
  s,ur:string;
  JvGIFAnimator1:TJvGIFAnimator;
  Image1,Image2: TImage;
  boo:boolean;
      IBDataBase:TIBDataBase;
    IBTran:TIBTransaction;
    IBTranDB:TIBTransaction;
    IBQuery:TIBQuery;

begin
   ur:=Copy(url,1,(Length(url)-4));
//если файл скачался
   if GetInetFile('http://www.yandex.ru/cycounter?'+url,extractfilepath(paramstr(0))+ur+'.gif') = true then
   begin
  //тут загружаем файл в image и начинаем распознавать его
    GetCX ( Image1.Picture.Bitmap.Width,
          Image1.Picture.Bitmap.Height,
          Image1.Picture.Bitmap,Image2.Picture.Bitmap,
          boo);
    if boo then
      GetCY ( Image1.Picture.Bitmap.Width,
          Image1.Picture.Bitmap.Height,
          Image1.Picture.Bitmap,s)
     else s:='0';
после распознования идет добавление в базу 
  try
  IBDataBase:=TIBDataBase.Create(nil);
  IBQuery:=TIBQuery.Create(nil);
  IBTran:=TIBTransaction.Create(nil);
  IBTranDB:=TIBTransaction.Create(nil);
  IBDataBase.DatabaseName:='localhost:E:\Acronis\tictest.gdb';
  IBDataBase.Params.Add('user_name=SYSDBA');
  IBDataBase.Params.Add('PASSWORD=masterkey');
  IBDataBase.Params.Add('lc_ctype=WIN1251');
  IBDataBase.LoginPrompt:=false;
  IBDataBase.DefaultTransaction:=IBTranDB;
  IBTranDB.DefaultDatabase:=IBDataBase;
  IBTran.DefaultDatabase:=IBDataBase;
  IBQuery.database:=IBDataBase;
  IbQuery.Transaction:=IbTran;
  IBDataBase.Connected:=true;
     IBQuery.SQL.Add('update TICKA set tic030310 = '+#39+s+#39+' where domenru = '+#39+url+#39);
     IBQuery.ExecSQL;
     IBQuery.Transaction.Commit;
     IBQuery.Close;
  IBQuery.Destroy;
  IBTran.Destroy;
  IBTranDB.Destroy;
  IBDataBase.Destroy;
   
      finally
        //
      end;

    end;

    Deletefile(extractfilepath(paramstr(0))+ur+'.gif');
    inherited;
end;
end.

PM MAIL   Вверх
Frees
Дата 31.3.2010, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



насколько я помню в каждом потоке должен быть свой коннект - ограничение firebird 


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Алкоголик
Дата 31.3.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

насколько я помню в каждом потоке должен быть свой коннект - ограничение firebird


так я вроде его и создаю или нет?
Код

 IBDataBase:=TIBDataBase.Create(nil);
  IBQuery:=TIBQuery.Create(nil);
  IBTran:=TIBTransaction.Create(nil);
  IBTranDB:=TIBTransaction.Create(nil);
  IBDataBase.DatabaseName:='localhost:E:\Acronis\tictest.gdb';
  IBDataBase.Params.Add('user_name=SYSDBA');
  IBDataBase.Params.Add('PASSWORD=masterkey');
  IBDataBase.Params.Add('lc_ctype=WIN1251');
  IBDataBase.LoginPrompt:=false;
  IBDataBase.DefaultTransaction:=IBTranDB;
  IBTranDB.DefaultDatabase:=IBDataBase;
  IBTran.DefaultDatabase:=IBDataBase;
  IBQuery.database:=IBDataBase;
  IbQuery.Transaction:=IbTran;
  IBDataBase.Connected:=true;

PM MAIL   Вверх
Deniz
Дата 31.3.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Алкоголик, попробую повторить вопрос.
А что не работает?
Ошибки? Не заносятся данные?
Зачем 2 транзакции не увидел.
IBQuery.Close;  - не нужно.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Frees
Дата 31.3.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



Цитата(Алкоголик @  31.3.2010,  17:29 Найти цитируемый пост)
так я вроде его и создаю или нет?

я писал долго код не увидел..


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Алкоголик
Дата 31.3.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Алкоголик @ 30.3.2010,  12:41)
Скачивание из инета файла/распознование его работает. А вот update отказывается делать.

Процитирую сам себя smile

Ошибок никаких не выдает, но  данные в базу не заносит.

Да одна транзакция лишняя в этом коде. Про Close учту.

Но не думаю, что проблема в этом.

Это сообщение отредактировал(а) Алкоголик - 31.3.2010, 14:56
PM MAIL   Вверх
Frees
Дата 31.3.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



Цитата(Алкоголик @  31.3.2010,  17:53 Найти цитируемый пост)
отказывается делать.

это не текст ошибки и не строка в которой это исключение было.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Alexeis
Дата 31.3.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Алкоголик @  31.3.2010,  13:53 Найти цитируемый пост)
Ошибок никаких не выдает, но  данные в базу не заносит.

  Может заносит, но у вас транзакция открыта в таком режиме, что вы не видите результатов пока не закроете ее и не откроете снова?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Deniz
Дата 1.4.2010, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Цитата(Алкоголик @  31.3.2010,  16:53 Найти цитируемый пост)
Да одна транзакция лишняя в этом коде.
Так удали одну транзакцию.
Перед
Код
IBQuery.ExecSQL;
выведи текст запроса в файл, и посмотри сам запрос, попробуй запустить его в IBExpert.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


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

FAQ раздела лежит здесь!


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

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


 




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


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

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