Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Дождаться ответа функции


Автор: WolfON 9.5.2007, 18:21
Есть функция соединения с сервером - Connect
Есть некоторая функция, которая ее вызывает- LogIn

Но функция соединения с сервером создает отдельный поток и возвращает то, что она соединилась вызовом OnStatusChange

Каким образом мне вызвать Connect и продолжить выполнять LogIn только после того, как OnStatusChange вернет добро?

OnStatusChange у меня устанавливает перменную connected в true и делает прочие полезные действия.

Единственная идея, которая у меня была - разбить LogIn на две части и добавить в OnStatusChange вызов  второй части функции. Но тогда, как быть, если Connect вызывается не из LogIn?

 smile 

Автор: MetalFan 9.5.2007, 18:54
перенести функцию из доп.потока в основной поток...

Автор: skyboy 9.5.2007, 19:21
если функция писана тобой и её можно изменить, то можно реализовать синхронизацию при помощи механизма http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BC%D0%B0%D1%84%D0%BE%D1%80_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29
Если же функция передана не тобой, то, возможно, там есть какой-то флаг вроде "synchronized" типа boolean, что позволит подключаться не в отдельном потоке, а "нормально". Т.е. дожидаясь окончания выполнения...

Автор: lukas 9.5.2007, 19:27
если функция Connect - возвращает результат соединения (true / false)


то вот так можно:

Код

repeat until Connect=true;

showmeessage('Соединение окончено...');



Автор: skyboy 9.5.2007, 20:20
Цитата(lukas @  9.5.2007,  18:27 Найти цитируемый пост)
repeat until Connect=true;

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

Автор: WolfON 10.5.2007, 20:44
Цитата
перенести функцию из доп.потока в основной поток...

проблема не в том, что я не догадаюсь этого сделать, а в том, чтобы дождаться выполнения потока

Код

repeat until Connect=true;

Аццко грузит процессор, тем более забивает все остальные потоки, если не делать Application.ProcessMessages;

Попробовал сделать семафорами:
Код

var
hSem : THandle = 0;
...

procedure Connect();
begin
  tcp.Connect(); //Создает независимый поток, который потом вызовет OnConnect
  WaitForSingleObject(hSem, INFINITE);
  showmessage('2');
  ReleaseSemaphore(hSem, 1, nil);
end;

procedure OnConnect(...);
begin
  showmessage('1');
  hSem := CreateSemaphore(nil, 1, 1, nil);  
end;


Но на выводе имею все-равно 2, потом 1.

Автор: MetalFan 11.5.2007, 08:09
WolfON, а что ты хотел? ждать то чего собрался, если семафор еще не создан?
сначала создай (только не так...), а потом жди... а в OnConnect 
и вообще, в данном случае хватило бы события(CreateEvent), а не семафора. тем более он совершенно неправильно используется
з.ы. а вообще, боланд уже реализовали классы-обертки для Event  и CriticalSection. находятся они в SyncObjs

Автор: Snowy 11.5.2007, 10:54
Просто крути Application.ProcessMessages, пока tcp.Connected не станет true.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)