![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 Мб влезет. |