![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#16  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Дружище, почитай что такое потоки и как оно работает. Ты должен запустить поток, а он уже будет вычитывать данные из очереди сам и сам загружать картинки. Ну и там тебе потребуется синхронизация через критическую секцию, тоже почитай об этом. Ибо то, что ты написал - это полный бред, поток сделан что бы выполнять разную работу в фоне, а не "дергать" его методы и ждать пока оно выполниться в остновном потоке, иначе в чем смысл доп. потоков... 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
leon2009 (19.10.2023)
  | ||
| 
		 
			 
			#17  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 нашел самый медленный, бесплатный 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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 все, понял  
		
	
		
		
		
		
		
	
		
		
	
	
	   критическая секция не даст оборвать закачку пока она не закончиться   если даже нажать на кнопку 1000 раз, то закачка не будет прервана остальными закачками ![]()  | 
| 
		 
			 
			#19  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Критическая секция регулирует "одновременный" доступ к общим ресурсам. Обеспечение непрерываемости загрузки лежит на самом потоке, но, с другой стороны, основной поток не должен непосредственно вмешиваться в работу потока, если надо прервать работу потока, основная программа должна запросить это у потока и подождать, пока поток выполнит эту команду. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
leon2009 (21.10.2023)
  | ||
| 
		 
			 
			#20  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 а из за чего предупреждение? вернее: 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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Это у тебя в запросе что-то не то. 
		
	
		
		
		
		
		
	
		
		
	
	
	Типа поле list не в списке GROUP BY, а походу ты делаешь какую то аггрегацию.  | 
| 
		 
			 
			#22  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 простая проверка на существование таблицы: она работает, а дальше код чтобы запись появилась  таблице. 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	//проверка таблицы на существование
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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Значит там какой-то косяк в служебных таблицах/вью. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
leon2009 (25.10.2023)
  | ||
| 
		 
			 
			#24  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 а так можно  
		
	
		
		
		
		
		
	
		
		
	
	
	   или полное ну   Код: 
	  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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 в общем готово  
		
	
		
		
			  1) ищем картинки в папке 2) не нагружая программу закачивает данные в MySQL (работает даже на самом медленном сервере)   3) можно редактировать записи   ну не то что хотел, но все таки.....первый раз вообще узнал что такое MySQL - и как таблица форматируется 4) можно даже поменять скин 5) -> делаю ini, чтоб храняшки не утекли. = откомпилированный EXE надо кому? весь код вверху. screen4.jpg screen5.jpg плохо, что ЕХЕ с грид = весит много обычно 14-27м, а тут 84-90 ![]()  | 
| 
		 
			 
			#26  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Во вторых - убери из проекта ненужные скины от DevExpress (там их надо отключить не только в настройках проекта, но и удалить ссылки на соотв. модули, обычно из главной формы). Я обычно подключаю 3-5 скинов. Думаю после этого в 30-40 Мб влезет.  |