| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Дождаться ответа функции |
| Автор: WolfON 9.5.2007, 18:21 |
| Есть функция соединения с сервером - Connect Есть некоторая функция, которая ее вызывает- LogIn Но функция соединения с сервером создает отдельный поток и возвращает то, что она соединилась вызовом OnStatusChange Каким образом мне вызвать Connect и продолжить выполнять LogIn только после того, как OnStatusChange вернет добро? OnStatusChange у меня устанавливает перменную connected в true и делает прочие полезные действия. Единственная идея, которая у меня была - разбить LogIn на две части и добавить в OnStatusChange вызов второй части функции. Но тогда, как быть, если Connect вызывается не из LogIn? |
| Автор: 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) то вот так можно:
|
| Автор: skyboy 9.5.2007, 20:20 |
т.е. у тебя код создает и создает новые потоки... а так как код выполняется в отдельном потоке(смотри первый пост), то если функция connect и возвращает булевский результат, то как признак (не)успешного запуска дополнительного потока, но никак не сигнал о результате подключения... |
| Автор: WolfON 10.5.2007, 20:44 | ||||||
проблема не в том, что я не догадаюсь этого сделать, а в том, чтобы дождаться выполнения потока
Аццко грузит процессор, тем более забивает все остальные потоки, если не делать Application.ProcessMessages; Попробовал сделать семафорами:
Но на выводе имею все-равно 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. |