Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2010, 22:21   #11
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Код:
function SetTimeOutJS(Str: String): Integer;//ищет время на странице
var
  I: Integer;
  S: String;
begin
  S := '")'',';
  I := Pos(S, Str);
  if I > 0 then
  begin
    S := Copy(Str, I + Length(S), Length(Str));
    I := Pos(')', S);
    if I > 0 then
    begin
      S := Trim(Copy(S, 1, I - 1));
      I := StrToIntDef(S, -1);
      if I > 0 then
        Result := I
      else
        Result := 0;
    end;
  end;
end;


procedure BOT.Execute;
var
  N: String;
  Url_Pay: String;
  h: Integer;
  D: Integer;
  Otvet: String;
  Otvet1: String;
  g1: String;
begin
      Otvet := HTTP_BOT.get('http://' + Url_Pay + N);
      Ur := парсит(Otvet);
      Otvet1 := HTTP_BOT.get('http://' + Url_Pay + Ur);
      h := SetTimeOutJS(Otvet1);
///
      HTTP_BOT.get('');
      Sleep(h);
      HTTP_BOT.get('http://' + Url_Pay + g1);
end;
Извеняюсь за тот код, сглупил и не то дал, из потока это единственное с чем связан слип

Последний раз редактировалось bulldog5293; 28.11.2010 в 00:31.
bulldog5293 вне форума Ответить с цитированием
Старый 27.11.2010, 22:32   #12
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

1. В выше приведенном коде не увидел ни одного Sleep'a.
2. Крайне рекомендую почитать про метод Synchronize, как он работает.
3. Также рекомендую почитать про критические секции, на мой взгляд один из лучших методов синхронизации потоков.

P.S. В 4-х, не обижайтесь, но это просто жуть какая-то
_Engine_ вне форума Ответить с цитированием
Старый 27.11.2010, 23:39   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
3. Также рекомендую почитать про критические секции, на мой взгляд один из лучших методов синхронизации потоков.
метод синхрониз через них работает.

ТС, покажите как создаете поток, похоже ошибка там.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.11.2010, 23:48   #14
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Код:
constructor BUX.Create(CreateSuspended: Boolean; aUrl, aLog, aPass: String);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate := True;
  Priority := tpLower;
  Url_Pay := aUrl;
  Login := aLog;
  Password := aPass;
end;

procedure TForm1.Bot_Button2Click(Sender: TObject);
  begin
  Pay:=BUX.Create(True);
  Pay.Resume;
  end;
bulldog5293 вне форума Ответить с цитированием
Старый 28.11.2010, 00:28   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

и где вы используете ваш новый конструктор?
idHTTP у вас общий чтоли? нельзя общий!
кстати зачем вы разные idhttp завели для разных запросов?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.11.2010, 00:31   #16
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

idhttp у меня общий, просто когда на форуме код оставляю, меняю названия на другие и забываю все поменять , а почему idhttp общим нельзя делать? это ты про его название HTTP_BOT или HTTP_BOT.nil?
bulldog5293 вне форума Ответить с цитированием
Старый 28.11.2010, 00:40   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а почему idhttp общим нельзя делать?
потому что тогда поток полностью не независим.
ибо если два потока будут использовать один компонент одновременно, они могут испортить его(тоже относится и переменным(особенно сложных))
вы пытались одновременно с кем то съесть яблоко?
поэтому лучше в поля потока вписать idhttp и в конструкторе создавать, а в деструкторе уничтожать.

а зачем названия то менять?
выложили как есть и не парьтесь исправлениями названий)
у вас в парсинге используются компоненты?
код потока у вас именно такой? ничего не удалено важного?(можно заголовок класса потока, БЕЗ исправлений(только заголовок без кода реализаций метода))
просто я писал на эту темку программку(у меня там и потоки были и синхронизация отменная, но исходники потерял вместе с диском С) поэтому опыт есть
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.11.2010, 00:56   #18
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Парсинг cтандартный, да вроде не чего важного не удалял
bulldog5293 вне форума Ответить с цитированием
Старый 28.11.2010, 03:27   #19
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
метод синхрониз через них работает.
И что с того?
Возьмите для примера:
procedure TThread.DoAnything;
var i : Integer;
begin
for I := 1 to 1000 do
begin
Sleep(1000);
Form1.Caption := IntToStr(i);
end;
end;

procedure TThread.Execute;
begin
while not Terminated do
Synchronize(DoAnything);
end;


или

procedure TThread.DoAnything;
var i : Integer;
begin
for I := 1 to 1000 do
begin
Sleep(1000);
EnterCriticalSection(CS);
Form1.Caption := IntToStr(i);
LeaveCriticalSection(CS);
end;
end;

procedure TThread.Execute;
begin
while not Terminated do
DoAnything;
end;

Попробуйте подвигать формой в первом случае и во втором.
_Engine_ вне форума Ответить с цитированием
Старый 28.11.2010, 03:34   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я вообще считаю и то и то плохим.
мое мнение что если потоки уж отделили, то не надо их спаривать через методы синхрониз и тд.
Код:
procedure TThread.DoAnything;
var i : Integer;
begin
for I := 1 to 1000 do
begin
Sleep(1000);
EnterCriticalSection(CS);
Form1.Caption := IntToStr(i);
LeaveCriticalSection(CS);
end; 
end;
нарушено правило VCL, ибо основной поток может в это время считывать данные этого самого Caption.
грозит глюками программы.

вообще пример неверен в корне.
Код:
procedure TThread.DoAnything;
begin
 Form1.Caption := IntToStr(i);
end;

procedure TThread.Execute;
//var i : Integer; в данном случае это поле класса TThread
begin
 while not Terminated do for I := 1 to 1000 do 
  begin
   Sleep(1000);
   Synchronize(DoAnything);
  end;
end;
вот так правильно.

а то через синхрониз вклинили код в основной поток и в итоге там и ждете, и цикл гоняете, он не для этого предназначен.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Sleep(50); за 63 мс... или за 47... Teksa Общие вопросы C/C++ 8 20.07.2010 08:34
Функция Sleep(); VadEr Общие вопросы Delphi 6 10.09.2009 17:45
Проблема с Sleep! k1r1ch Общие вопросы Delphi 11 20.06.2009 19:12
Функция для Sleep russian-stalker Общие вопросы Delphi 5 12.09.2008 16:40
Альтернатива sleep Zuzlan Общие вопросы Delphi 2 01.11.2007 01:44