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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2013, 11:35   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Дождаться завершения работы процедуры

Доброго времени суток!
Есть код
Код:
unit Unit1;
...
type
  // Поток для авторизации
  TLogin_Thread = class(TThread)
  private
    { Private declarations }
    s, Nick: string;
    B: Boolean;
  protected
    procedure Execute; override;
    procedure SyncProc;
  public
  end;

var
  FormMain: TFormMain;
  Login_Thread: TLogin_Thread;

implementation

{$R *.dfm}

procedure TFormMain.Login;
var
  s: string;
begin
  s := ENick.Text;
  if s = '' then s := 'TNewUser';

  Login_Thread := TLogin_Thread.Create(True);
  Login_Thread.Nick := s;
  Login_Thread.FreeOnTerminate := True;
  Login_Thread.Resume;
end;

procedure TLogin_Thread.Execute;
var
  HTTP: TIdHTTP;
  Data: TIdMultiPartFormDataStream;
begin
  B := True;

  try
    HTTP := TIdHTTP.Create(nil);
    Data := TIdMultiPartFormDataStream.Create;
    try
      Data.AddFormField('nick', AnsiToUtf8(Nick));
      s := HTTP.Post('http://192.168.0.2/si/login.php', Data);
    except
      B := False;
    end;
  finally
    FreeAndNil(Data);
    FreeAndNil(HTTP);
  end;

  Synchronize(SyncProc);

  Terminate;
end;

procedure TLogin_Thread.SyncProc;
var
  UserID, LoginStatus, AdminFlags: string;
begin
  if B then
  begin
    UserID := Copy(s, 1, Pos('~', s) - 1);
    Delete(s, 1, Pos('~', s));
    LoginStatus := Copy(s, 1, Pos('~', s) - 1);
    Delete(s, 1, Pos('~', s));
    AdminFlags := s;

    MessageBox(0, PChar(UserID + #13#10 + LoginStatus + #13#10 + AdminFlags), '.!.', MB_ICONInformation);
  end
  else FormMain.TimerAuthorization.Enabled := True;
end;

procedure TFormMain.TimerAuthorizationTimer(Sender: TObject);
begin
  TimerAuthorization.Enabled := False;
  Login;
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  Login;
  ShowMessage('Ready!');
end;

end.
При нажатии на Button1 нужно дождаться завершения работы процедуры Login и вывести Ready!.
Такое реально?
Shouldercannon вне форума Ответить с цитированием
Старый 13.11.2013, 11:43   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

1. сделать её функцией.
2. Добавить call-back-событие, которое произойдет из метода и сигнализирует, что процесс завершен:
Код:
type
  TCallBackProc = procedure(aResult:Integer) of object;

procedure ProcWithCB(a,b:real; const aCallback:TCallBackProc  = nil);
begin

//В нужный момент 
if assigned(aCallback) then
aCallback(100500);
end;
Человек_Борща вне форума Ответить с цитированием
Старый 13.11.2013, 12:04   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
Thread.WaitFor;
...
FreeAndNil(Thread);
и FreeOnTerminate должно быть False
call-back не поможет

Terminate какой смысл из потока вызывать? Этот метод просто в Terminated True присваивает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.11.2013 в 12:07.
Аватар вне форума Ответить с цитированием
Старый 13.11.2013, 14:09   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
При нажатии на Button1 нужно дождаться завершения работы процедуры Login и вывести Ready!.
Такое реально?
Особенно если перефразировать это так.
при нажатии запустить процедуру(поток) авторизации и по завершении оного вывести данные о результатах.
Код:
procedure TFormMain.Button1Click(Sender: TObject);
begin
  Login; //запустили и почти-что забыли о нем
end;

procedure TFormMain.Login;
var
  s: string;
begin
  s := ENick.Text;
  if s = '' then s := 'TNewUser';

  Login_Thread := TLogin_Thread.Create(True);
  Login_Thread.Nick := s;
  Login_Thread.FreeOnTerminate := True;
  Login_Thread.Onterminate:=self.SetLoginState; //как только закончишь сделай это ("пришли" пожалйста результат)!
  Login_Thread.Resume;
end;

procedure TformMain.SetLoginState(sender: TObject);
begin // ну наконец-то ты нам "прислал" результат
  if (Sender as TLogin_Thread). ... <здесь мы проверяем каковы результаты>  then 
   showMessage('ура!)
  else  
   ShowMessage('увы....');
end;
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дождаться завершения работы командной строки ivt22 Общие вопросы Delphi 21 01.11.2013 11:59
Дождаться завершения другой программы в консоле delphi SawaMEN Общие вопросы Delphi 4 09.09.2013 14:26
access violation после завершения работы процедуры Dreanks Помощь студентам 4 15.10.2011 14:02
Как дождаться завершения запущенного приложения DennerV Win Api 5 13.08.2010 13:48
Как дождаться завершения процедуры? Hintman Win Api 6 14.10.2009 14:46