Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дождаться ответа функции 
:(
    Опции темы
WolfON
  Дата 9.5.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



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

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

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

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

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

 smile 
PM MAIL ICQ   Вверх
MetalFan
Дата 9.5.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



перенести функцию из доп.потока в основной поток...

Это сообщение отредактировал(а) MetalFan - 9.5.2007, 18:55


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
skyboy
Дата 9.5.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



если функция писана тобой и её можно изменить, то можно реализовать синхронизацию при помощи механизма семафоров
Если же функция передана не тобой, то, возможно, там есть какой-то флаг вроде "synchronized" типа boolean, что позволит подключаться не в отдельном потоке, а "нормально". Т.е. дожидаясь окончания выполнения...
PM MAIL   Вверх
lukas
Дата 9.5.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



если функция Connect - возвращает результат соединения (true / false)


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

Код

repeat until Connect=true;

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





--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
skyboy
Дата 9.5.2007, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



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

т.е. у тебя код создает и создает новые потоки... а так как код выполняется в отдельном потоке(смотри первый пост), то если функция connect и возвращает булевский результат, то как признак (не)успешного запуска дополнительного потока, но никак не сигнал о результате подключения...
PM MAIL   Вверх
WolfON
Дата 10.5.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Цитата
перенести функцию из доп.потока в основной поток...

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

Код

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.
PM MAIL ICQ   Вверх
MetalFan
Дата 11.5.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



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

Это сообщение отредактировал(а) MetalFan - 11.5.2007, 08:14


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Snowy
Дата 11.5.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Просто крути Application.ProcessMessages, пока tcp.Connected не станет true.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1210 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.