Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 19.10.2023, 18:18
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Дружище, почитай что такое потоки и как оно работает. Ты должен запустить поток, а он уже будет вычитывать данные из очереди сам и сам загружать картинки. Ну и там тебе потребуется синхронизация через критическую секцию, тоже почитай об этом. Ибо то, что ты написал - это полный бред, поток сделан что бы выполнять разную работу в фоне, а не "дергать" его методы и ждать пока оно выполниться в остновном потоке, иначе в чем смысл доп. потоков...
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
leon2009 (19.10.2023)
  #17  
Старый 19.10.2023, 21:05
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение критическая секция

нашел самый медленный, бесплатный mysql
с потоком разобрался, пока закачивает, формой можно играться
я не стал трогать synchronize(AddToDbCb); = т.к. тупить начинает.
И не уверен:
Код:
cs:TCriticalSection;
CS.Enter;
= нужно ли вообще это?
Код:
 type
  TInsertImageToDbCallBack = procedure(AFileName: String; ASize: Integer) of object;

  private
    { Private declarations }
  public
  procedure FileImg(const dirName:string; ACallBack : TInsertImageToDbCallBack);
  procedure AddToMemoCb(AFileName: String; ASize: Integer);
  //procedure AddToDbCb(AFileName: String; ASize: Integer);
    { Public declarations }
  end;

  TSomeThread = class(tthread)
private
  procedure AddToDbCb(AFileName: String; ASize: Integer);
protected
  procedure execute; override;
end;

var
  Form1: TForm1;
  cs:TCriticalSection;
  chek:boolean;

implementation

{$R *.dfm}

type
  TFileItemData = class
    AFileName : String;
    ASize : Integer;
    function toString : String;
  end;

procedure TSomeThread.AddToDbCb(AFileName: String; ASize: Integer);
begin
form1.SqlConnection1.Open;
try
  form1.SqlQuery1.SQL.Text := 'INSERT INTO test1 (id, name, reviews, size, attribute) VALUES (:id, :name, :reviews, :size, :attribute)';
  form1.SqlQuery1.ParamByName('id').AsInteger := 1;
  form1.SqlQuery1.ParamByName('name').AsString := AFileName;
  form1.SqlQuery1.ParamByName('reviews').AsInteger := random(5);// Arews;
  form1.SqlQuery1.ParamByName('size').AsInteger := ASize; //inttostr(imgsize);
  form1.SqlQuery1.ParamByName('attribute').AsString := 'gggggg';
  form1.SQLQuery1.ExecSQL;
  form1.Memo1.Lines.Add('Запись_добавлена='+Afilename+inttostr(ASize));
finally
form1.SqlConnection1.Close;
end;
end;

procedure TSomeThread.execute;
  var
  obj : TFileItemData; i:integer;
  begin
  inherited;
  CS.Enter;
  //synchronize(AddToDbCb);
  if form1.ListBox2.Count =14 then
    begin
    for i := 0 to  form1.ListBox2.Count-1 do  begin
      obj := form1.ListBox2.Items.Objects[i] As TFileItemData;
      AddToDbCb(obj.AFileName,obj.ASize);
      form1.progressbar1.Position:=i;
    end;
end;

end;

function TFileItemData.toString : String;
begin
  Result := Format('FileName: %s; Size: %d',[AFileName,ASize]);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  NewThread: TSomeThread;
begin
  NewThread:=TSomeThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
  NewThread.Resume;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  cs:=TCriticalSection.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
cs.Free;
end;
курсы для чайников с ноля можно???

Последний раз редактировалось leon2009, 20.10.2023 в 06:31.
Ответить с цитированием
  #18  
Старый 20.10.2023, 10:11
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Плохо понял

все, понял критическая секция не даст оборвать закачку пока она не закончиться если даже нажать на кнопку 1000 раз, то закачка не будет прервана остальными закачками
Ответить с цитированием
  #19  
Старый 20.10.2023, 18:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Критическая секция регулирует "одновременный" доступ к общим ресурсам. Обеспечение непрерываемости загрузки лежит на самом потоке, но, с другой стороны, основной поток не должен непосредственно вмешиваться в работу потока, если надо прервать работу потока, основная программа должна запросить это у потока и подождать, пока поток выполнит эту команду.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
leon2009 (21.10.2023)
  #20  
Старый 25.10.2023, 03:40
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение доктор

а из за чего предупреждение? вернее: 3 разных соединений.
localhost, servermysql.com и dbfree.com
первые два работают отлично а на третьем ошибка
error1.jpg
при выполнение:
Код:
procedure TForm1.Showtables;
begin
if  sqlconnection1.Connected=true then begin
    SQLTable1.TableName:='tabl1';
    SQLTable1.Active:=true;
    ClientDataSet1.Active:=true;
  end;
Ответить с цитированием
  #21  
Старый 25.10.2023, 08:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это у тебя в запросе что-то не то.
Типа поле list не в списке GROUP BY, а походу ты делаешь какую то аггрегацию.
Ответить с цитированием
  #22  
Старый 25.10.2023, 11:10
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка все просто

простая проверка на существование таблицы: она работает, а дальше код чтобы запись появилась таблице.
Код:
//проверка таблицы на существование
procedure TForm1.Showtables;
begin
    SQLQuery1.SQLConnection:=SQLConnection1;
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.Text:='SHOW TABLES LIKE "'+edit6.Text+'"'; //SQLQuery1.SQL.Text:='select * from test1';
    SQLQuery1.Open;
if not SQLQuery1.IsEmpty then
begin
    memo1.Lines.Add('Поле с таким значением есть');
if  sqlconnection1.Connected=true then begin
    SQLTable1.TableName:=Edit6.Text;
    SQLTable1.Active:=true;
    ClientDataSet1.Active:=true;
  end;
end
    else
          begin
    memo1.Lines.Add('Поле с таким значением нет');
end;
    SQLQuery1.Close;

end;
Ответить с цитированием
  #23  
Старый 25.10.2023, 11:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Значит там какой-то косяк в служебных таблицах/вью.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
leon2009 (25.10.2023)
  #24  
Старый 26.10.2023, 18:26
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Плохо мучение

а так можно или полное ну
Код:
  AColumn1 := cxGrid1DBTableView1.GetColumnByFieldName('id');  
  AColumn2 := cxGrid1DBTableView1.GetColumnByFieldName('name');
  AColumn3 := cxGrid1DBTableView1.GetColumnByFieldName('reviews');
  AColumn4 := cxGrid1DBTableView1.GetColumnByFieldName('size');
  AColumn5 := cxGrid1DBTableView1.GetColumnByFieldName('attribute');
  if AColumn1 <> nil then  
    for I := 0 to cxGrid1DBTableView1.Controller.SelectedRecordCount - 1 do  begin  
      edit10.Text:=(cxGrid1DBTableView1.Controller.SelectedRecords[i].Values[AColumn1.Index]);
      edit11.Text:=(cxGrid1DBTableView1.Controller.SelectedRecords[i].Values[AColumn2.Index]);
      edit12.Text:=(cxGrid1DBTableView1.Controller.SelectedRecords[i].Values[AColumn3.Index]);
      edit13.Text:=(cxGrid1DBTableView1.Controller.SelectedRecords[i].Values[AColumn4.Index]);
      edit14.Text:=(cxGrid1DBTableView1.Controller.SelectedRecords[i].Values[AColumn5.Index]);
    end;
 
form1.SqlConnection1.Open;
try 
SQLQuery1.SQL.Text := 'UPDATE test1 SET name = :name, reviews = :reviews, size = :size, attribute = :attribute WHERE id = :id';   
  form1.SqlQuery1.ParamByName('name').AsString := edit11.Text;
  form1.SqlQuery1.ParamByName('reviews').AsInteger := strtoint(edit12.Text);// Arews;
  form1.SqlQuery1.ParamByName('size').AsInteger := strtoint(edit13.Text); //inttostr(imgsize);
  form1.SqlQuery1.ParamByName('attribute').AsString := edit14.Text; 
  form1.SqlQuery1.ParamByName('id').AsInteger := strtoint(edit10.Text);
SQLQuery1.ExecSQL;
finally
form1.sqlconnection1.Connected:=false;  
end; 
т.к. я пробовал и
Код:
cxGrid1DBTableView1.DataController.DataModeController.SmartRefresh:=True;
cxGrid1DBTableView1.DataController.DataSource.DataSet.Edit;
cxGrid1DBTableView1.DataController.DataSource.DataSet.FieldByName('id').Value := 444;
cxGrid1DBTableView1.DataController.DataSource.DataSet.post;
руки не от туда ....
Ответить с цитированием
  #25  
Старый 27.10.2023, 10:10
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка Готово

в общем готово
1) ищем картинки в папке
2) не нагружая программу закачивает данные в MySQL (работает даже на самом медленном сервере)
3) можно редактировать записи ну не то что хотел, но все таки.....
первый раз вообще узнал что такое MySQL - и как таблица форматируется
4) можно даже поменять скин
5) -> делаю ini, чтоб храняшки не утекли.

= откомпилированный EXE надо кому? весь код вверху.

screen4.jpg

screen5.jpg

плохо, что ЕХЕ с грид = весит много обычно 14-27м, а тут 84-90
Ответить с цитированием
  #26  
Старый 27.10.2023, 20:46
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
плохо, что ЕХЕ с грид = весит много обычно 14-27м, а тут 84-90
Ну, для начала скомпили релиз.
Во вторых - убери из проекта ненужные скины от DevExpress (там их надо отключить не только в настройках проекта, но и удалить ссылки на соотв. модули, обычно из главной формы). Я обычно подключаю 3-5 скинов.
Думаю после этого в 30-40 Мб влезет.
Ответить с цитированием
  #27  
Старый 31.10.2023, 08:01
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Смех программа

Готов - от компилил СКАЧАТЬ
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter