Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: передача blob, как параметра, внутрь и наружу TThread / 25 сообщений из 39, страница 1 из 2
23.08.2017, 10:56:41
    #39509166
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
Решил полностью перенести логику чтения/записи из/в БД в доп.потоки.

С передачей обычных типов проблем нет
Код: pascal
1.
TThread.Create(CreateSuspended: boolean; AParamsArr: Array of Variant;......);



Как запихать сабж в параметр и/или передать его в основной поток?
=================
Док.

Win7 Ultim x64/Deb 8.7 i386:
FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb),
Lazarus 1.9(r.55538); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2
...
Рейтинг: 0 / 0
23.08.2017, 11:00:45
    #39509170
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
Как поток...

Который TMemoryStream то есть.
...
Рейтинг: 0 / 0
23.08.2017, 11:02:02
    #39509172
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
wadmanКак поток...

Который TMemoryStream то есть.
вот гад Ты пальцем покажи, не догоняю ..
...
Рейтинг: 0 / 0
23.08.2017, 11:32:24
    #39509193
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
Док,
поток - стрим,
нить - тред.

Такие дела.
...
Рейтинг: 0 / 0
23.08.2017, 12:07:36
    #39509215
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
ДокКак запихать сабж в параметр
В старом дельфевом (когда было String=AnsiString) IBX работало
ParamByName( 'BLOBFIELD' ).AsString := SBlobData,
где SBlobData - любые (можно и бинарные) данные блоб.
Может сработать
...
Рейтинг: 0 / 0
23.08.2017, 12:29:42
    #39509233
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
чччД,

т.е. затроллить решили? Ладно-ладно ...

YuRockМожет сработать
а если там бинарных данных на десяток мегабайт? Я смогу впихнуть невпихуемое в параметр?

зы. я-то надеялся, можно указатель какой передать или где. А так придется на буржуйский форум идти :(
...
Рейтинг: 0 / 0
23.08.2017, 12:32:30
    #39509235
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
Док,

Блоб-поля можно вводить и выводить через TStream, Например TMemoryStream.
...
Рейтинг: 0 / 0
23.08.2017, 12:35:45
    #39509239
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
DesWind,

ты хоть словами скажи (хотя бы схематично), что-как-где создать сначала, куды запихнуть потом. При этом так, чтобы анимашка крутилась и сообщения юзверю показывала. Я реально че-та затупил...
...
Рейтинг: 0 / 0
23.08.2017, 13:12:03
    #39509271
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
ДокYuRockМожет сработать
а если там бинарных данных на десяток мегабайт? Я смогу впихнуть невпихуемое в параметр?

зы. я-то надеялся, можно указатель какой передать или где. А так придется на буржуйский форум идти :(
десяток мегабайт - это не так уж и много.
Вот если на гигабайты счет - тогда плохо. Для этого уже только TBlobField.LoadFromStream.
Но, блин, что за база такая ( на FB ), в которую гигабайтами блобы льют - страшно представить)
...
Рейтинг: 0 / 0
23.08.2017, 13:15:44
    #39509276
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
ДокЯ смогу впихнуть невпихуемое в параметр?
Зависит от того, сработает ли на твоём IBX такое. У меня работает.
На моём отлично работает так:
Код: pascal
1.
2.
FInsertCommand.ParamByName( 'BLOB_DATA' ).AsString := SBlobData;
FInsertCommand.ExecQuery;


где SBlobData - неюникодный стринг,
FInsertCommand - один раз препарированный TIBSQL с инсертом и параметром.
...
Рейтинг: 0 / 0
23.08.2017, 13:36:36
    #39509296
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
Не вижу проблемы вытащить из базы:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    qTasksPAYLOAD: TOraMemoField; { TMemoField, TBlobField, ... }
....
        if qTasksPAYLOAD.BlobSize > 0 then
        begin
          Context.TaskStream := TMemoryStream.Create;
          Context.TaskStream.Size := qTasksPAYLOAD.BlobSize;
          qTasksPAYLOAD.SaveToStream(Context.TaskStream);
        end
        else
          Context.TaskStream := nil;



Поместить в базу еще проще:

Код: pascal
1.
  qTasksPAYLOAD.LoadFromStream (Context.TaskStream);



далее стандартные операции TDataSet
...
Рейтинг: 0 / 0
23.08.2017, 13:44:47
    #39509313
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
ага, спасибо. Ушел думать ...
...
Рейтинг: 0 / 0
23.08.2017, 14:39:22
    #39509374
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
В UIB у полей есть такие свойства как AsStream и AsBytes - но не уверен, что он соберется на Лазаре.

В любом случае - если речь идет о бооольших блобах, то задержка может быть и на дисковой операции, и на сетевой (БД)

Т.е. там нужно в отдельной нити (thread) сделать отдельное соединение с БД, и уже в этом отдельном соединении грузить блоб.
...
Рейтинг: 0 / 0
23.08.2017, 14:57:24
    #39509392
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
schiПоместить в базу еще проще:

Код: pascal
1.
  qTasksPAYLOAD.LoadFromStream (Context.TaskStream);


Да, но в таком варианте много неявных и явных "лишних" операций:
- открыть запрос
- сделать Append
- заполнить поля
- сделать Post
- перед всем этим оформить InsertSQL правильно...

В случае препарированного инсерта ничего этого делать не надо.
задал параметр - и Exec, всё.
...
Рейтинг: 0 / 0
23.08.2017, 15:14:37
    #39509405
Любезный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
1. Каждый коннект должен быть в своем Thread, и это правильно.
2. Вроде у TField должны быть методы LoadFromStream и SaveToStream.
...
Рейтинг: 0 / 0
23.08.2017, 15:24:06
    #39509411
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
Чтение
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
      LStrm := TIBBlobStream.Create;
      try
        LStrm.Mode := bmRead;
        LStrm.Database := ADS.Database;
        LStrm.Transaction := ADS.Transaction;
        LStrm.BlobID := AField.AsQuad;
        LStrm.ReadBuffer(.........);
      finally
        LStrm.Free;
      end;

Запись
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      LStrm := TIBBlobStream.Create;
      try
        LStrm.Mode := bmWrite;
        LStrm.Database := ADS.Database;
        LStrm.Transaction := ADS.Transaction;
        LStrm.WriteBuffer(.......);
        LStrm.Finalize;
        AField.AsQuad := LStrm.BlobID;
      finally
        LStrm.Free;
      end;

Соответственно TIBBlobStream создаешь в потоке, а обмениваешься BlobID (AsQuad). Как это все будет работать в многопотоке - хз.
...
Рейтинг: 0 / 0
23.08.2017, 15:32:30
    #39509413
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
Для датасетов такой способ
Код: pascal
1.
LStrm := AField.DataSet.CreateBlobStream(AField, bmWrite);

И потом этот стрим отдаешь в поток. Дисклаймер тот же_Vasilisk_Как это все будет работать в многопотоке - хз.
...
Рейтинг: 0 / 0
23.08.2017, 15:33:20
    #39509414
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
_Vasilisk_Для датасетов такой способТолько не забудь потом вызвать
Код: pascal
1.
LStrm.Free;
...
Рейтинг: 0 / 0
23.08.2017, 15:41:28
    #39509417
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
YuRockschiПоместить в базу еще проще:

Код: pascal
1.
  qTasksPAYLOAD.LoadFromStream (Context.TaskStream);


Да, но в таком варианте много неявных и явных "лишних" операций:
- открыть запрос
- сделать Append
- заполнить поля
- сделать Post
- перед всем этим оформить InsertSQL правильно...

В случае препарированного инсерта ничего этого делать не надо.
задал параметр - и Exec, всё.

Виноват, DataSet, которым я пользуюсь, понимает, что запись в поле это задание параметров для запроса вставки/обновления. Аналог TUpdateSQL.
...
Рейтинг: 0 / 0
23.08.2017, 18:37:53
    #39509522
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
_Vasilisk_,

за IBBlobStream спасибо, не знал. Надо будет посмотреть в том форке, который у меня в Лазаре стоит.

Проблемы в доп.потоке создать/уничтожить компоненты доступа и коннект нет. Есть проблема обмена блобами между потоками. Пошел шарить по исходникам.
...
Рейтинг: 0 / 0
23.08.2017, 19:34:37
    #39509540
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
Док, что такое "блоб"?
...
Рейтинг: 0 / 0
23.08.2017, 20:47:59
    #39509573
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
schiВиноват, DataSet, которым я пользуюсь
Вот в том то и дело. А для insert'а в базу DataSet не нужен.
...
Рейтинг: 0 / 0
23.08.2017, 20:55:33
    #39509579
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
чччДДок, что такое "блоб"?
Бинарные данные произвольного размера (форматированный текст, картинки и проч.)
...
Рейтинг: 0 / 0
23.08.2017, 22:00:24
    #39509603
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
ДокчччДДок, что такое "блоб"?
Бинарные данные произвольного размера (форматированный текст, картинки и проч.)

Ну, загрузи эти данные из базы в память да передай в нить адрес начала блока и его длину.
Например, с помощью TMemoryStream.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  fQ_IBX : TIBSQL; // IBX
  fQ_FIB : TpFIBQuery; // FIB+

  fMS : TMemoryStream;
begin
  fMS := TMemoryStream.Create;
...
  fQ_IBX.FieldByName('blob_field_1').SaveToStream(fMS);
...
  fQ_FIB.FieldByName('blob_field_2').SaveToStream(fMS);


И передавай в нить этот самый fMS.

Если блок данных очень уж велик, то сохраняй в файл:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  fQ_IBX : TIBSQL; // IBX
  fQ_FIB : TpFIBQuery; // FIB+

  fFS : TFileStream;
begin
  fFS := TFileStream.Create(<имя временного файла>, fmCreate);
...
  fQ_IBX.FieldByName('blob_field_1').SaveToStream(fFS);
...
  fQ_FIB.FieldByName('blob_field_2').SaveToStream(fFS);


... или даже в файл, который будет автоматически удаляться, кода он станет не нужным:

Код: pascal
1.
2.
3.
4.
5.
var
  fH : Handle;
begin
  fH := CreateFile(<имя временного файла>, GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0);
  fFS := TFileStream.Create(fH);


... а то и просто хэндл файла передавай.
...
Рейтинг: 0 / 0
23.08.2017, 22:30:25
    #39509618
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: передача blob, как параметра, внутрь и наружу TThread
YuRockschiВиноват, DataSet, которым я пользуюсь
Вот в том то и дело. А для insert'а в базу DataSet не нужен.

Может и не нужен, но с ним удобнее. Я не до конца понимаю, о чем дискуссия, правда :)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: передача blob, как параметра, внутрь и наружу TThread / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]