powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus SQL многопоточность INSERT
6 сообщений из 31, страница 2 из 2
Lazarus SQL многопоточность INSERT
    #39803066
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneo,
с сетевым протоколом не работал, деталей реализации подсказать не смогу.

По коду: вот это
Код: pascal
1.
form1.memo1.lines.add('Complete '+numpotok+': '+timetostr(endtime-starttime));


я бы завернул в Queue(PostMessage) или Synchronize(SendMessage).
...
Рейтинг: 0 / 0
Lazarus SQL многопоточность INSERT
    #39803140
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneo
Код: pascal
1.
2.
3.
4.
  if not HTTPs.HTTPMethod('POST','https://contragent.cdek.ru/api/preback')  then
    MessageDlg('POST Ошибка '+ IntToStr(HTTPs.Resultcode)+#13#10+HTTPs.Resultstring,mtError,[mbok],0) 
  else
    temp:= PChar(HTTPs.Document.Memory);


Зачем из потока показываете диалоговое окно?! Ошибки выводите в лог к примеру.
Ну и заворачивайте использование экземпляров в блоки try-finally. Иначе при ошибках будут утечки памяти.
...
Рейтинг: 0 / 0
Lazarus SQL многопоточность INSERT
    #39803187
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это все конечно хорошо, спасибо за советы, но может кто-то знает как в данном случае реализовать очередь потоков с пост запросами? Я ставлю 5 потоков по 30 раз с задержкой в 2 секунды между ними - тогда все отрабатывается на ура, но я хочу сделать это все как надо реализовав очередь и убрав не нужные простои в 2 секунды, но не знаю как. Кто подскажет?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
for i:=30 downto 1 do
begin

for l:=0 to 4 do
begin
k:=k-1;
DecodeDate(k,YY,MM,DD);
day:=inttostr(DD);
if length(day)=1 then day:='0'+day;
month:=inttostr(MM);
if length(month)=1 then month:='0'+month;

MyThread := TMyThread.Create(True,'9500','0',inttostr(i),'{"field":"dateCreatedFrom","value":"'+inttostr(YY)+'-'+month+'-'+day+'"},{"field":"dateCreatedTo","value":"'+inttostr(YY)+'-'+month+'-'+day+'"}',inttostr(YY)+'-'+month+'-'+day); // With the True parameter it doesn't start automatically
if Assigned(MyThread.FatalException) then
  raise MyThread.FatalException;
MyThread.Start;
end;
sleep(2000);

end;
...
Рейтинг: 0 / 0
Lazarus SQL многопоточность INSERT
    #39803196
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как только встречаются большие файлы я даже с таким количеством потоков и задержкой получаю ошибки, на один файл приходится до 8мб, но мое предположение состоит в том, что несколько потоков забивают сетевой канал и следующий пост запрос в потоке уже не может получить код страницы, так как канал сетевой забит.
...
Рейтинг: 0 / 0
Lazarus SQL многопоточность INSERT
    #39803216
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneo,

забитый канал скорее приведет к ошибкам таймаута, а не просто пустой странице. сам сервер при нагрузке может тупить и возвращать что то не то.
...
Рейтинг: 0 / 0
Lazarus SQL многопоточность INSERT
    #39803535
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MoneoКто подскажет?
В главном потоке любые циклы с задержкой будут приводить к "подвисаниям" UI, что воспринимается, как фризы и лаги. Отсюда не видно, по каким критериям ты контроллируешь, что ты успел выкачать на клиента удачно, а что - нет. В твоем случае я бы схематично сделал цикл внутри Execute доп.потока как-нибудь так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
   counter: integer;
   result: boolean;
begin
   ...
   counter:= 0;
   result:= false;
   while not result and (counter < 100) do
   begin
      try
        result:= HTTPs.HTTPMethod('POST','https://contragent.cdek.ru/api/preback');
        //возвращаем результат в файл или куда там еще...  
      except
        //пишем ошибку в лог и проч.
      end;
      
      inc(counter);
      sleep(1000); //время задержки взято от балды
   end;
   ... ///тут твой дальнейший код
end;



Повторюсь, я с синапсом никогда не работал, поэтому ничего дельного посоветовать не могу. Попробуй глянуть еще тут
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus SQL многопоточность INSERT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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