Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 29.12.2012, 17:40   #21
eoln
Профессионал
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,691
Репутация: 2251

icq: 421277094
По умолчанию

TThread самый подходящий, т.к работа идёт с vcl. В Delphi потокам нельзя работать с vcl, поэтому обычные АПИ просто так использовать нельзя!
Причём тут "тормозит поток"? И при чём "не трогая основной"? Зачем их тормозить в данной задаче? Или вы мне о потоках хотите рассказать? Спасибо, не надо. Эти потоки сами по себе и им никто не нужен, кроме случая синхронизации, когда управление передаётся в главный поток (саму программу).

Цитата:
Ибо для синхронизации нужно создать событие... можно пустое, а можно и с какой то фуной.
Видимо попытка догадаться что такое TThread Никаких методов событий и прочего создавать не надо. TThread самодостаточен
eoln вне форума   Ответить с цитированием
Старый 29.12.2012, 18:24   #22
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Адрес: Москва
Сообщений: 495
Репутация: 67

skype: Perchik71
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Видимо попытка догадаться что такое TThread Никаких методов событий и прочего создавать не надо. TThread самодостаточен
Иногда его тяжёлых вес крайне излишен для простых задач. кстати вы не правы... лично мне удовалось апи потоками работать с vcl что вы знали

это метод описан в модуле Classes для вашего развитя
Код:
function ThreadProc(Thread: TThread): Integer;
var
  FreeThread: Boolean;
begin
  TThread.FCurrentThread := Thread;
{$IFDEF LINUX}
  if Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem);
{$ENDIF}
  try
    if not Thread.Terminated then
    try
      Thread.Execute;
    except
      Thread.FFatalException := AcquireExceptionObject;
    end;
  finally
    FreeThread := Thread.FFreeOnTerminate;
    Result := Thread.FReturnValue;
    Thread.DoTerminate;
    Thread.FFinished := True;
    SignalSyncEvent;
    if FreeThread then Thread.Free;
{$IFDEF MSWINDOWS}
    EndThread(Result);
{$ENDIF}
{$IFDEF LINUX}
    // Directly call pthread_exit since EndThread will detach the thread causing
    // the pthread_join in TThread.WaitFor to fail.  Also, make sure the EndThreadProc
    // is called just like EndThread would do. EndThreadProc should not return
    // and call pthread_exit itself.
    if Assigned(EndThreadProc) then
      EndThreadProc(Result);
    pthread_exit(Pointer(Result));
{$ENDIF}
  end;
end;
SignalSyncEvent;
тормозит поток, даже если вы не указывали с чем синхронизировать, дабы что бы vcl шла паралельно с вашым потоком. иногда это излишне.
__________________
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума   Ответить с цитированием
Старый 29.12.2012, 18:30   #23
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Адрес: Москва
Сообщений: 495
Репутация: 67

skype: Perchik71
По умолчанию

Цитата:
TThread самый подходящий, т.к работа идёт с vcl. В Delphi потокам нельзя работать с vcl, поэтому обычные АПИ просто так использовать нельзя!
Причём тут "тормозит поток"? И при чём "не трогая основной"? Зачем их тормозить в данной задаче? Или вы мне о потоках хотите рассказать? Спасибо, не надо. Эти потоки сами по себе и им никто не нужен, кроме случая синхронизации, когда управление передаётся в главный поток (саму программу).
Сразу понятно, что у вас мало знаний по апи. и вы пользуетесь чсто готовыми текстами, которые слишком огромные.. и порой не решают должным образом вашу задачу. я думаю это из-за вашей лени.
__________________
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума   Ответить с цитированием
Старый 29.12.2012, 20:21   #24
Slym
Профессионал
 
Регистрация: 07.12.2011
Адрес: Siberia
Сообщений: 1,021
Репутация: 759
По умолчанию

не в ту степь полезли...
по сабжу почти ровно для полугодовалого хоть Synchronize в тему
а вот с доступом к переменным i и memo фигово...
1 Memo - VCL нинадо сейчас работает завтра перестанет грабли случайные
2 как можно меньше глобальных переменных и тем более общих для разных потоков. заведи свою персональную i в private потока и пользуй
3 i должна в потоке меняться а не снаружи
4. try finally обязательно
5. в конструктор создание шелухи как насоветовали можно не делать и так нормально
Slym вне форума   Ответить с цитированием
Старый 29.12.2012, 20:25   #25
eoln
Профессионал
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,691
Репутация: 2251

icq: 421277094
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
лично мне удовалось апи потоками работать с vcl что вы знали...
а я молотком шурупы забивал. Картина на стене на этом шурупе до сих пор держится.

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
для вашего развитя.
не надо переходить на оскорбления, читайте лучше книги.

Более спорить не намерен.

Slym, полностью согласен. Нужен только Synhronize, а конструкторы, деструкторы не нужны - всё можно в экзекуции сделать.

Последний раз редактировалось eoln; 29.12.2012 в 20:28.
eoln вне форума   Ответить с цитированием
Старый 29.12.2012, 20:39   #26
Slym
Профессионал
 
Регистрация: 07.12.2011
Адрес: Siberia
Сообщений: 1,021
Репутация: 759
По умолчанию

Код:
type
  TMyThread = class(TThread)
  private
    Line,Data:string;
  protected
    procedure Update;
    procedure GetLine;
    procedure Execute; override;
  end;


procedure TMyThread.Execute;
var
  HTTP:TIdHTTP;
  PostData:TStringList;
  TryCount:Integer;
  email,pass:string;
begin
  HTTP:=TIdHTTP.Create(nil);
  try
    HTTP.AllowCookies := true;
    HTTP.HandleRedirects := true;
    HTTP.Request.Host:=('*****.mail.ru');
    HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0';
    HTTP.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
    HTTP.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3';
    HTTP.Request.AcceptEncoding:='gzip, deflate';
    HTTP.Request.Connection:='keep-alive';
    HTTP.Request.ContentType:='application/x-www-form-urlencoded';
    PostData:=TStringList.Create;
    try
      while not Terminated do
      begin
        Synchronize(GetLine);
        if Line='' then Break;
        PostData.Clear;
        email:=trim(copy(Line,1,pos(';',Line)-1));
        pass:=trim(copy(Line,pos(';',Line)+1,length(Line)-pos(';',Line)+1));
        PostData.add('name='+email);
        PostData.add('pass='+pass);
        PostData.add('op=%D0%92%D1%85%D0%BE%D0%B4+%D0%B2+%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%83');
        PostData.add('form_build_id=form-6d1652dd1259cd84e60af5e57ee4f61f');
        PostData.add('form_id=user_login' );
        TryCount:=3;
        while TryCount>0 do
        try
          Data:=HTTP.post('сайт',PostData);
          TryCount:=0;
        except
          dec(TryCount);
          if TryCount=0 then ;//обработать неудачу
        end;
        Synchronize(Update);
      end;
    finally
      PostData.Free;
    end;
  finally
    HTTP.Free;
  end;
end;

procedure TMyThread.GetLine;
begin
  if form2.LineIndex<form2.smemo1.Lines.Count then
  begin
    Line:=form2.smemo1.Lines[form2.LineIndex];
    inc(form2.LineIndex);
  end else
    Line:='';
end;

procedure TMyThread.Update;
begin
  if pos ('Время участия',Data)>0 then  begin
  form2.smemo2.lines.add(Line);
end;
в форме
private
LineIndex:integer;


procedure TForm2.sButton1Click(Sender: TObject);
var
i:Integer;
begin
LineIndex:=0;
for l := 0 to updown1.position do
MyThread:=TMyThread.Create(true);
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=false;
MyThread.resume;
end;
Slym вне форума   Ответить с цитированием
Старый 29.12.2012, 21:02   #27
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Адрес: Москва
Сообщений: 495
Репутация: 67

skype: Perchik71
По умолчанию

Не умру я от того что вы мне репу уронили дети малые.
Потешайтесь как хотите. в вашем разделе.
Более я в этом разделе не буду ибо вобще не перевариваю людей делфистом.
слишком много о себе мните. красавцы хреновы.
//----
Цитата:
читайте лучше книги.
прочёл я достаточно... это вам не помешало бы.
__________________
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 29.12.2012 в 21:08.
Perchik71 вне форума   Ответить с цитированием
Старый 30.12.2012, 10:13   #28
admin22
Пользователь
 
Регистрация: 27.09.2011
Сообщений: 26
Репутация: 10
По умолчанию

Slym спасибо за код

Последний раз редактировалось admin22; 30.12.2012 в 11:39.
admin22 вне форума   Ответить с цитированием
Старый 02.05.2014, 08:34   #29
Luzer007
Новичок
 
Регистрация: 02.05.2014
Сообщений: 1
Репутация: 10
По умолчанию

Уважаемые кодеры, объясните код.

1. Где здесь могут быть указаны потоки?
Код:
for l := 0 to updown1.position do
2. Что это за TryCount, для чего он? Почему присваивается 3 и что с ним выполняется?
Код:
TryCount:=3;
        while TryCount>0 do
        try
          Data:=HTTP.post('сайт',PostData);
          TryCount:=0;
        except
          dec(TryCount);
          if TryCount=0 then ;//обработать неудачу
        end;
        Synchronize(Update);
      end;
3. Где здесь вывести в Memo2, если были посланы неправильные данные? И в Memo3, если получена ошибка от сервера?
Luzer007 вне форума   Ответить с цитированием
Старый 02.05.2014, 09:56   #30
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,815
Репутация: 6850
По умолчанию

Цитата:
Что это за TryCount, для чего он? Почему присваивается 3 и что с ним выполняется?
Здесь есть цикл попыток получения инфы с сайта. дается 3 попытки, и TryCount - счетчик этих попыток. Если попытка удалась - цикл выходит. Если не удалась то обработать неудачу скажем sleep() поставить, и попытаться еще раз.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли прикрутить javascript к IE? Gorkiy JavaScript, Ajax 1 14.11.2011 10:05
Как прикрутить Events alex_alpha Win Api 2 17.12.2010 22:14
[Perl] Прикрутить цикл gamer123 PHP 8 01.11.2010 14:04
Прикрутить к функции таймер JustKurt Общие вопросы Delphi 8 03.08.2009 13:55
Как прикрутить GiveIO ? caveman Assembler 2 03.12.2007 09:43


14:34.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.