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