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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2015, 11:03   #1
lord24
Форумчанин
 
Регистрация: 04.01.2013
Сообщений: 107
По умолчанию Помогите с потоком

Ребята, помогите с потоком. Делаю отдельным потоком первый раз по этому не все понимаю как надо.
Есть вот это
Код:
TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
и вот это - запуск потока
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
Ini: Tinifile;
MyThread: TMyThread;
begin
  MyThread := TMyThread.Create(True);
  MyThread.FreeOnTerminate :=true;
  MyThread.Priority:=tpLower;
  MyThread.Resume;
End;
Хочу остановить поток (пауза) и завершить его.
Останавливаю так
Код:
procedure TMyThread.Execute;
begin                                       //Здесь описывается код, который будет выполняться в потоке
while true do
begin
  If MessageDlg('Поток работает 1. Остановить?',mtConfirmation, [mbYes,mbNo],0)=mrYes
  then
  begin
  MyThread.Suspend;
  end;

end;
end;
Если так, то вылазит ошибка непонятная

Что надо сделать?
lord24 вне форума Ответить с цитированием
Старый 10.11.2015, 11:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чет какой-то... эрунда...
MessageDlg нужно вызывать из твоей формы, а не потока.
А поток описывать так:
Код:
while not Terminated do
begin
 //Здесь описывается код, который будет выполняться в потоке
end;
Соответственно в главной форме:
Код:
 If MessageDlg('Поток работает 1. Остановить?',mtConfirmation, [mbYes,mbNo],0)=mrYes then MyThread.Terminate;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2015, 11:21   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я с потоками никогда всерьёз не сталкивался,
но я бы вынес определение переменной потока MyThread
Цитата:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
Ini: Tinifile;
MyThread: TMyThread;
из FormCreate (например, в глобальные переменные)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2015, 12:03   #4
lord24
Форумчанин
 
Регистрация: 04.01.2013
Сообщений: 107
По умолчанию

Простите за тупость, но ни чего не понимаю...
Вместо моего цикла
Код:
while true do
Надо
Код:
while not Terminated do
Внутри тела писать что?
Суть такая.
Есть программа, которая выполняет какую-то работу. В отдельном потоке я хотел закрутить проверку на доступность сайта. Проверяю доступность путем отправки на скрипт данных и получением ответа от него. Куда писать код проверки и если ответ false сообщить пользователю о недоступности, и как прервать поток, если
Цитата:
MessageDlg нужно вызывать из твоей формы, а не потока.
lord24 вне форума Ответить с цитированием
Старый 10.11.2015, 12:56   #5
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Вы хотите сделать проверку доступности своего сайта отправляя данные для скрипта в запросе, верно?

Отправляйте с помощью idhttp.post запрос к сайту и с помощью php обрабатывайте отправленные данные, после чего выводите на страницу соответствующую запись, а потом в delphi обрабатывайте ответ.


Примерно так:

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyThread := TMyThread.Create(True);
  MyThread.FreeOnTerminate :=true;
  MyThread.memo:=memo1.lines;
  MyThread.Priority:=tpLower;
  MyThread.Resume;
End;


type
  TMyThread = class(TThread)
     memo : TStrings;
     IdHTTP1: TIdHTTP;
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  MyThread: TMyThread;


procedure TMyThread.Execute;
  var
    Data : TStringList;
    Html : string;
begin
  IdHTTP1:=TIdHTTP.Create(nil);
  IdHTTP1.HandleRedirects:=True;

  Data := TStringList.Create;
  Data.Clear;
  Data.Add('param=1');
  Data.Add('param=2');

  try
    Html:=IdHTTP1.Post('http://site.ru/', Data);
    if AnsiPos('True', Html)>0 then memo.add('Сайт доступен');
  finally
    Data.Free;
    IdHTTP1.Free;
  end;
end;
bilibian вне форума Ответить с цитированием
Старый 10.11.2015, 13:16   #6
lord24
Форумчанин
 
Регистрация: 04.01.2013
Сообщений: 107
По умолчанию

да что-то подобное я и сделал, но где вызвать остановку потока если сайт не доступен, что бы он (поток) больше не крутился? и сообщить об этом пользователю

Последний раз редактировалось lord24; 10.11.2015 в 13:23.
lord24 вне форума Ответить с цитированием
Старый 10.11.2015, 13:19   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
где вызвать остановку потока
Во-первых: Загружай сайт с установкой таймаута.
Во-вторых: Кикнуть поток можно по клику кнопки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2015, 13:23   #8
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от lord24 Посмотреть сообщение
да что-то подобное я и сделал, но где вызвать остановку потока если сайт не доступен, что бы он (поток) больше не крутился? и сообщить об этом пользователю
Код:
procedure TMyThread.Execute;
  var
    Data : TStringList;
    Html : string;
begin
  IdHTTP1:=TIdHTTP.Create(nil);
  IdHTTP1.HandleRedirects:=True;

  Data := TStringList.Create;
  Data.Clear;
  Data.Add('param=1');
  Data.Add('param=2');

  try
    while not Terminated do begin
      Html:=IdHTTP1.Post('http://site.ru/', Data);
      if AnsiPos('True', Html)>0 then begin
        memo.add('Сайт доступен');
      end else MyThread.Terminate;
    end;
  finally
    Data.Free;
    IdHTTP1.Free;
  end;
end;
bilibian вне форума Ответить с цитированием
Старый 10.11.2015, 13:45   #9
lord24
Форумчанин
 
Регистрация: 04.01.2013
Сообщений: 107
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Во-первых: Загружай сайт с установкой таймаута.
Это как? sleep?
Цитата:
Сообщение от Stilet Посмотреть сообщение
Во-вторых: Кикнуть поток можно по клику кнопки.
Надо программно
lord24 вне форума Ответить с цитированием
Старый 10.11.2015, 13:51   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это как? sleep?
посмотри среди свойств, у IdHTTP1 где-то должно быть свойство установки таймаута, после которого компонент выдает исключение о том, что не может достучаться до сайта.
Цитата:
Надо программно
Ради бога. В событии клика кнопки можно повесить функцию ExitThread() к примеру, которая будет кикать поток. Ну или посмотреть каким методом TThread это делается принудительно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с RTSP потоком (нужно сделать снимок из потока) power11 Мультимедиа в Delphi 1 30.04.2015 20:01
Проблема с потоком! vovken1997 Общие вопросы Delphi 2 12.04.2012 21:21
Проблема с потоком ZekaUa Общие вопросы Delphi 4 01.02.2012 15:29
Проблемы с потоком spydark91 Общие вопросы Delphi 38 23.06.2011 16:23
Проблема с потоком Araver Общие вопросы Delphi 4 16.10.2007 04:30